当前位置: 首页 > 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; 希望大家多多支…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

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

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

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...