![](https://img-blog.csdnimg.cn/20190918140158853.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
力扣随笔之双指针
分享解题思路
百万拳去见
欢迎指正,共同进步
展开
-
力扣随笔之寻找重复数(中等287)
思路2:根据快慢指针来解决,由于nums数组中有且仅有一个重复的整数,那么可以将nums数组链表化,因为有“一个”重复的整数,所会有有且仅有“一个环”产生,根据快慢指针找到环的入口,即可。思路1:暴力解法,根据要求不修改数组且只用常量级O(1)的额外空间,我们写两层嵌套循环,寻找重复的数;可以解决部分问题,但会超出时间限制无论Java还是C++;定义指针p1 从slow开始走,p2从0开始走,当p2与p1相遇,相遇那个点就是环的入口。如图slow一次走一步,fast一次走两步,得到如下数学关系。原创 2024-02-25 14:54:18 · 441 阅读 · 0 评论 -
力扣随笔之颜色分类(中等75)
思路:定义两个指针划分left,right划分三个区域left左边是红色区域,right右边是蓝色区域,left和right之间是白色区域;定义一个遍历指针遍历整个数组,遇到红色与left所指位置数字交换,并将left自加,i也自加;遇到白色,继续遍历下一个;遇到蓝色与right所指位置数字交换,并将right自减;当遍历指针遇到区域分界线right,遍历结束。原创 2024-02-23 00:49:23 · 414 阅读 · 0 评论 -
力扣随笔之通过删除字母匹配到字典里最长单词(中等524)
针对第一个问题可以初始化两个指针i,j分别指向s和英文单词的首位字母开始遍历,若字母相同,则两个指针i,j同时自加,若不同则i自加,寻找s中与英文单词对应位置字母相同的字母;最后当j的大小等于单词长度则说明s可以通过删减得到这个单词,并将其返回。针对第二个问题可以对词典dictionary进行预处理:根据长度降序和字母序升序来排序。思路:根据题意有两个问题待解决。原创 2024-02-22 23:45:00 · 590 阅读 · 0 评论 -
力扣随笔之平方数之和(中等633)
思路1:暴力解法,在枚举a的同时根据求平方根方法sqrt求出b,若b是整数则返回ture,若不为整数,则继续枚举a;注:暴力枚举也可以减少一些枚举的次数,a枚举a的范围为 a^2 < sqrt(c)若 a^2 + b^2 == c 则return true;若 a^2 + b^2 < c 则a++;若 a^2 + b^2 > c 则b--;思路二:根据双指针来解,设定a <= b <= sqrt(c)原创 2024-02-22 13:50:55 · 904 阅读 · 2 评论 -
力扣随笔之两数之和 Ⅱ -输入有序数组(中等167)
定义左右两个指针(下标)从数组两边开始遍历,若左右指针所指数字之和大于目标数,则将右指针自减,若左右指针所指数字之和小于目标数,则左指针自加,若左右指针所指数字之和等于目标数,则返回一个数组[++left,++right]当左指针 >= 右指针时遍历结束,return null表示没找到。思路:在递增数组中找出满足相加之和等于目标数。原创 2024-02-21 21:37:26 · 413 阅读 · 0 评论 -
力扣随笔之盛最多水的容器(中等11)
思路:定义左右两个指针(下标)为left和right,定义一个指针low,指向左右指针所指数字的较小者。现在容器容水量为:(right - left)× low;因为当底边减少的条件下,面积增大的唯一可能就是高增加,所以我们现在寻找的就是比low高的垂线,当low指向左指针时,左边开始自增遍历寻找比low高的垂线,找到后计算面积,并与最大面积比较,取两者较大者;当low指向右指针时,右指针开始自减寻找比low高的垂线,找到后计算面积,并与最大面积比较,取两者较大者。原创 2024-02-21 23:15:12 · 449 阅读 · 0 评论 -
力扣随笔之验证回文串 Ⅱ(简单680)
思路:可以将这个问题简化一下,最多可删除一个字符,有两种情况:一是没有删除,该字符串就是回文串;二是删除了一个字符串,这个删除也分两种情况,当检测它不是回文串是有两种选择:一种是删除左边,一种是删除右边,删除之后再检查是否是回文串,然后还有一个独立出来的问题就是怎么解决检测回文串,设置两个指针(下标)分别从左右开始检测。a 左右指针不同,则两种情况,删右边,右指针自减,删左边,左指针自加。左右指针相同,则左指针自加,右指针自减。右指针:红色加粗,左指针:黑色加粗。原创 2024-02-21 20:54:23 · 527 阅读 · 0 评论 -
力扣随笔之三数之和(中等15)
定义三个指针i,j,k,令i指向0,j指向i+1,k指向nums.length - 1,若 i,j,k指向的三个数之和小于0,则j自加,若大于0,则k自减,若等于0,则记录,当j不再小于k时,i自加(这里要判断i自加后指向的数字是否与原来指向的数字相等,若相等,则i再次自加),继续让j指向i+1,k指向nums.length - 1;未排序:-1 0 1 2 -1 -4。已排序:-4 -1 -1 0 1 2。思路:先将无序数组按递增排序,用示例1来说明。注:有些许小细节补充在代码中。原创 2024-02-22 00:20:45 · 452 阅读 · 1 评论 -
力扣随笔之将数组分成和相等的三个部分(简单1013)
思路:要分成和相等的三个部分,那有两种情况:一是所有数加起来不能被3整除,则可以直接return false;二是所有数加起来可以被3整除,那我们定义每部分的数key应等于sum/3,分成三个相等的部分,我们只需要砍两刀,定义两个指针,分别从左和右开始遍历,定义两个计数变量来储存左右两部分的值,当找到两个部分等于 key,那第三个部分一定也等于key,找到后return true。当左指针 + 1 >= 右指针,还没有return true,则return false,表示不能划分为三个相等的部分。原创 2024-02-21 16:21:27 · 570 阅读 · 0 评论 -
力扣随笔之合并两个有序数组(简单88)
思路:根据给定的是两个递增数组nums1和nums2,可以定义两个指针(即下标)将数组从后往前遍历,较大的数字直接将其放到nums1对应的位置,遍历结束,即合并完成。原创 2024-02-21 14:52:58 · 385 阅读 · 0 评论 -
力扣随笔之按奇偶排序数组(简单905)
思路二:优化解法,定义一个指针(下标)从头开始遍历,定义一个指针(下标)指向数组最后一个数,当左指针遇见奇数则将其与右指针指向的数做交换,右指针自减,左指针不变,这样右指针右边的数一定是奇数;继续判断左指针指向的数是否为奇数,若为奇数,则与右指针指向的数做交换,右指针再次自减,有点类似于滑动窗口,右指针右边的数全为奇数;若左指针为偶数,则左指针自加,右指针不变。红色加粗数字即现在左指针所指的数字,黑色加粗数字即为右指针指向的数字,左指针现在指向的数为奇数,交换左右指针的数字,并右指针自减,左指针不变。原创 2024-02-21 15:46:22 · 489 阅读 · 1 评论