当前位置: 首页 > news >正文

不容易解的题9.26

想编写这一版,是因为之前复习字符串或者双指针等其他栏目时候没有写文章,但是现在回过头来刷,所以想着写一篇,我在leetcode的收藏夹里收藏了一些我自认为需要多加练习的题目,它们并非是很难的,极不易理解的题目,而是对于我来说题目简单但是却不好写代码的、代码需要注意的细节多的和非常规思路的。这些题并不都是很难,但有些需要技巧


209.长度最小的子数组

209. 长度最小的子数组 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/minimum-size-subarray-sum/?envType=list&envId=ZCa7r67M这道题并不是所谓真正意义上的难题,而是我为了警示自己,要认真读题,这道题一开始做的时候我把大于等于target这一重要的解题关键信息,粗略的看成了等于target,做完了之后自然是没有ac,去看了官方题解,发现很不可思议,甚至觉得是测试用例出错了,相信大家也遇到过和我类似的情况吧,认真读题是关键

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int left=0;int mincount=INT_MAX;int sum=0;for(int i=0;i<nums.size();++i){sum+=nums[i];while(sum>=target){mincount=min(mincount,i-left+1);//先做统计sum-=nums[left];++left;}}return mincount==INT_MAX?0:mincount;    }
};

为数不多我觉得需要注意的细节是:使用while循环缩小窗口而非if语句,这是因为如果遇上了前几个数很小,当前数字很大的情况,这时需要很快的情况窗口找答案,如果你用if去判断,看上去没什么问题,但是如果数组长度很小,你很容易找不到正确的答案,i就已经走到数组末尾了,也就是右窗口遍历的太快了,以至于虽然后面可能含有答案,你也拿不到了

还有一个注意的点是计数器mincount先做统计,再进行缩小窗口,不然也可以做出来,就是比较时候麻烦些而已。顺便说一下,也可以不让右窗口一直移到,这样就不用考虑这些,每次先判断窗口和与target比较,不过这样代码显得不够整洁


454.四数相加II

454. 四数相加 II - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/4sum-ii/?envType=list&envId=ZCa7r67M这道题是有技巧的,不过也相对其他题简单一些,解题思路是两个数组为一组,进行相加,把和录到哈希表map里,这里的键记录的是两个数相加的和,值记录的是这个和出现的次数,前两个数组和入到哈希表以后,再用0-另两个数组和看看能不能在map里找到。如果能则使res+=map【0-sum】
为什么是+=
之前我的想法是,每找到一次map对应的位置值--
但是是不对的,因为我们并不是重复计算了那个数字的个数,而是两数组的各个位置和都算了一遍,如果自减了,就很可能导致遍历第三四数组查找那个位置时,本次查找减没了,而下一次查找时候要用时候没有了
这里的道理和前两个数组相加求值需要累加道理是一样的,不同的位置加出来的和,肯定是下标不会重复的
去自行模拟一下【-1,-1】、【-1,1】、【-1,1】、【1,-1】
便可以知道


15.三数之和

15. 三数之和 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/3sum/?envType=list&envId=ZCa7r67M看起来和上一道题是一样的题,一样的思路,其实不然,这道题其实不适合纯哈希表解决(反正我只用哈希表现在是超时的)

并且仔细看题目可以知道,上一道题是在四个数组里找和是target的,这道题是在一个数组里找三个数,它们的和等于0,看着差不多,但是不同的是三数之和需要对三元组进行去重,去重的需要使得使用哈希表变得十分困难。我们要在加法循环里使用set哈希辅助完成数据的存储,然后判断第二个数字去重,则更为麻烦

思路简单的来说是外层循环遍历第一个数,里层用set来避免元素重复使用,这次使用5这个数字和上次也使用5这个数字得到的结果是重复的,那如何判断呢就是要排序,并不仅仅是j>i&&nums【j-1】==nums【j】这样就去重了,比如说【0,0,0,0】这个数据,我们i第一次遍历到第一个数,里层循环遍历第二个数字,而我们此时在哈希表里找有没有第三个数字相加得到0,显然是找不到的,因为我们还没有开始放数在哈希表,然后进行j++,走到第三个0这个时候直接判断那步排重直接就跳出循环了,这是错误的。

并且放哈希表的数不是0-当前两个数字的和,而是放入当前第二个数遍历的数字,这也是当时很让我费解的,为什么不放入0-前两个数字的和也不放入第三个数而是选择放入第二个呢?这是因为0-前两个数和在整个数组不一定能找得到,这不是存在的数不能放进去,而第三个数字要想取得,是要再写循环的,这就失去了写哈希表的意义,也增大了时间复杂度

总的来说,在面试时用哈希很难写出题解,要注意很多细节,和剪枝,稍不留神就超时了,细节尤其是第二个数字的重复判断,我觉得不知道这个特殊测试用例的话,是很难想到bug出在哪里的!

ok说了这么多,我们来看看推荐的写法是什么?推荐的写法应该是排序和双指针的搭配解法,同样也需要排序,记住,大多数的需要去重的时候,都需要对数据排序。排序后,外层循环遍历第一个数,里层循环是双指针,一个指针☞i的下一个数字,另一个☞数组最后一个数字,因为已经排好序了,所以如果当前三个数加起来过大就使右指针向左移,反之左指针向右移。

这里排序起到了两个作用,一是使去重变得简单,二是使数据有规律后双指针能够调节,使答案更容易被找到

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(),nums.end());int sum=0;vector<vector<int>>res;int left=0,right=0;if(nums[0]>0)return res;for(int i=0;i<nums.size();++i){if(i>0&&nums[i]==nums[i-1])continue;int slow=i+1,fast=nums.size()-1;while(slow<fast){if(slow>i+1&&nums[slow]==nums[slow-1]){slow++;continue;}if(fast+1<nums.size()&&nums[fast]==nums[fast+1]){fast--;continue;}if(nums[i]+nums[slow]+nums[fast]==0){res.push_back({nums[i],nums[slow],nums[fast]});slow++,fast--;}else if(nums[i]+nums[slow]+nums[fast]>0)fast--;else slow++;}}return res;}
};

18.四数之和

18. 四数之和 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/4sum/?envType=list&envId=ZCa7r67M四数之和要比四数之和II是难一点的,不过思路也是类似三数之和的,可以说上一道题知道思路,这一道题也可以很容易的解出来。

也是排序去重+双指针解法,不同的是由于是四个数的和,所以外层是双for循环,然后里面还是双指针的思路,直接看代码

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {sort(nums.begin(),nums.end());vector<vector<int>>res;for(int i=0;i<nums.size();++i){if(i>0&&nums[i]==nums[i-1])continue;for(int j=i+1;j<nums.size();++j){if(j>i+1&&nums[j]==nums[j-1])continue;int left=j+1,right=nums.size()-1;while(left<right){if((long)nums[i]+nums[j]+nums[left]+nums[right]==target){res.push_back({nums[i],nums[j],nums[left],nums[right]});left++,right--;while(left<right&&nums[left]==nums[left-1])left++;while(left<right&&nums[right]==nums[right+1])right--;}else if((long)nums[i]+nums[j]+nums[left]+nums[right]>target)right--;else left++;}}}return res;}
};

这个代码和上一道题的双指针循环里判断两个指针去重又有一些不同,但是思路是一样的,这道题的排重思路是如果此时找到了答案,那就直接进入先放到res数组里,然后去重,保证下一次找到的答案绝对不会重复,采用循环去重是正确的选择,因为可能连续几个答案都一样。

那为什么上一道题使用的是if呢?这能去重干净吗?

仔细看,它的去重是一进来就排重,而且排重完毕后continue,再判断一次,直到相邻不再重复,这其实和while是一样的效果,只是两种表达方式。

这道题是不能和四数之和II去类比的,应该和上一道题三数之和去比较,都不适合用哈希,同样的官方题解也并未给出哈希解法


以上便是这一期的全部内容,下一期同样也是不容易解的专题

都看到这里了如果有用的话别忘了一键三连哦,如果是互粉回访我也会做的!

大家有什么想看的题解,或者想看的算法专栏、数据结构专栏,可以去看看往期的文章,有想看的新题目或者专栏也可以评论区写出来,讨论一番,本账号将持续更新。
期待您的关注

相关文章:

不容易解的题9.26

想编写这一版&#xff0c;是因为之前复习字符串或者双指针等其他栏目时候没有写文章&#xff0c;但是现在回过头来刷&#xff0c;所以想着写一篇&#xff0c;我在leetcode的收藏夹里收藏了一些我自认为需要多加练习的题目&#xff0c;它们并非是很难的&#xff0c;极不易理解的…...

易点易动固定资产管理系统:精准管理与科学采购,降本增效的利器

在现代企业管理中&#xff0c;固定资产的精准管理和科学采购已成为提升企业效率和降低成本的重要环节。为了满足企业管理的需求&#xff0c;我们自豪地介绍易点易动固定资产管理系统&#xff0c;这是一款功能强大的软件解决方案&#xff0c;旨在帮助企业实现固定资产的精准管理…...

人大金仓分析型数据库外部表(二)

外部表错误数据 默认情况下&#xff0c;如果外部表数据中包含有一个错误&#xff0c;命令就会失败并且不会有数据被载入到目标数据库表中。gpfdist 文件服务器使用 HTTP 协议。使用 LIMIT的外部表查询会在检索到所需的 行后结束连接&#xff0c;导致一个HTTP 套接字错误。 如…...

rtp流广播吸顶喇叭网络有源吸顶喇叭

SIP-7043 rtp流广播吸顶喇叭网络有源吸顶喇叭 一、描述 SIP-7043是我司的一款SIP网络有源吸顶喇叭&#xff0c;具有10/100M以太网接口&#xff0c;内置有一个高品质扬声器&#xff0c;将网络音源通过自带的功放和喇叭输出播放&#xff0c;可达到功率20W。SIP-7043作为SIP系统的…...

Spring学习笔记12 面向切面编程AOP

Spring学习笔记11 GoF代理模式_biubiubiu0706的博客-CSDN博客 AOP(Aspect Oriented Programming):面向切面编程,面向方面编程. AOP是对OOP的补充延申.底层使用动态代理实现. Spring的AOP使用的动态代理是:JDK动态代理_CGLIB动态代理技术.Spring在这两种动态代理中灵活切换.如…...

【0225】源码分析postgres磁盘块(disk block)定义

相关阅读: 【0040】 PostgreSQL数据库表文件底层结构布局分析 1. postgres磁盘块定义 在学习本文之前,需要对关系表的结构原理有一定的理解。如果不清楚PG磁盘数据表文件的布局,可阅读:...

第九章 动态规划 part11 123. 买卖股票的最佳时机III 188. 买卖股票的最佳时机IV

第五十天| 第九章 动态规划 part11 123. 买卖股票的最佳时机III 188. 买卖股票的最佳时机IV 一、123. 买卖股票的最佳时机III&#xff08;难难难难难&#xff09; 题目链接&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/ 题目介绍&#xff…...

阿里云服务器共享型和企业级独享有什么区别?

阿里云ECS云服务器共享型和企业级有什么区别&#xff1f;企业级就是独享型&#xff0c;共享型和企业级云的主要区别CPU调度模式&#xff0c;共享型是非绑定CPU调度模式&#xff0c;企业级是固定CPU调度模式&#xff0c;共享型云服务器在高负载时计算性能可能出现波动不稳定&…...

Vue.js基本语法上

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《springMvc使用》 ⛺️ 生活的理想&#xff0c;为了不断更新自己 ! 目录 1.插值 1.1 文本 1.2 v-v-html 1.3 数据双向绑定数据(v-model) 1.4 属性&#xff…...

【1333. 餐厅过滤器】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个餐馆信息数组 restaurants&#xff0c;其中 restaurants[i] [idi, ratingi, veganFriendlyi, pricei, distancei]。你必须使用以下三个过滤器来过滤这些餐馆信息。 其中素食者友好过滤器 v…...

wifi7有关的210个提案

[1] TGbe, “Compendium of motions related to the contents of the TGbe specification framework document,” 19/1755r8, September 2020. [2] Bin Tian (Qualcomm), “Discussion on 11be PHY capabilities,” 20/0975r0, July 2020. [3] TGbe, “Compendiu…...

200行C++代码写一个Qt俄罗斯方块小游戏

小小演示一下&#xff1a; 大体思路&#xff1a; 其实很早就想写一个俄罗斯方块了&#xff0c;但是一想到那么多方块还要变形&#xff0c;还要判断落地什么的就脑壳疼。直到现在才写出来。 俄罗斯方块这个小游戏的小难点其实就一个&#xff0c;就是方块的变形&#xff0c;看似…...

蓝桥杯每日一题20223.9.26

4407. 扫雷 - AcWing题库 题目描述 分析 此题目使用map等都会超时&#xff0c;所以我们可以巧妙的使用哈希模拟散列表&#xff0c;哈希表初始化为-1首先将地雷读入哈希表&#xff0c;找到地雷的坐标在哈希表中对应的下标&#xff0c;如果没有则此地雷的位置第一次出现&#…...

查看基站后台信息

查看基站后台信息 电脑配置固定ip: 192.168.1.99: 打开“网络和共享中心”&#xff0c;选择更改适配器设置&#xff1a; 右键“本地连接”&#xff0c;选择属性 基站网线直连电脑网口 Telnet 登录基站 打开dos窗口 windows键R”&#xff0c;输入cmd&#xff0c;点确定&…...

关于坐标的旋转变换和坐标系的旋转变换

不管是坐标的旋转变换还是坐标系下的旋转变换&#xff0c;只和旋转的顺时针和逆时针有关。然坐标系间的顺时针和逆时针是根据当前坐标系在目标坐标系下的相对位置确定。 一。逆时针旋转belta角度的公式 二。顺时针旋转belta角度的公式 三。坐标的旋转变换 1.坐标的旋转变换相…...

2023.9.19 关于 数据链路层 和 DNS 协议 基本知识

目录 数据链路层 MTU DNS 协议 补充 DHCP协议 数据链路层 基本概念&#xff1a; 考虑相邻两个节点之间的传输&#xff08;通过 网线 / 光纤 / 无线 直接相连的两个设备&#xff09;以太网协议 规定了 数据链路层 和 物理层 的内容 IP地址 与 mac地址 的相互配合 IP地址 描…...

如何保证接口幂等性

简介 接口幂等性就是说用户使用相同的参数请求同一个接口无论是一次还是多次都应该是一样的。不会因为多次的点击产生不同效果。 举个栗子&#xff1a;一个用户在手机APP上提200块钱&#xff0c;然后一不小心点击了两次&#xff0c;那么就应该只提取出200块钱&#xff0c;不应…...

搭建智能桥梁,Amazon CodeWhisperer助您轻松编程

零&#xff1a;前言 随着时间的推移&#xff0c;人工智能技术以惊人的速度向前发展&#xff0c;正掀起着全新的编程范式革命。不仅仅局限于代码生成&#xff0c;智能编程助手等创新应用也进一步提升了开发效率和代码质量&#xff0c;极大地推动着软件开发领域的快速繁荣。 当前…...

数组和指针笔试题解析之【指针】

目录 &#x1f342;笔试题1&#xff1a; &#x1f342;笔试题2&#xff1a; &#x1f342;笔试题3&#xff1a; &#x1f342;笔试题4&#xff1a; &#x1f342;笔试题5&#xff1a; &#x1f342;笔试题6&#xff1a; &#x1f342;笔试题7&#xff1a; &#x1f342;笔试题…...

【Linux】之Centos7卸载KVM虚拟化服务

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...