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

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...