一、高频题目
同向双指针
88. 合并两个有序数组——双指针
1、防止nums元素被改写,先摘录大的元素放入nums空白处
2、交叉摘录数组元素
3、单方摘录某数组元素
26. 删除有序数组中的重复项
1、i用于维护处理好的元素
2、j用于挑选未处理好的元素
3、当不重复 i++,j++ 重复时j++
283. 移动零
1、i用于维护处理好的非0元素
2、j用于挑选未处理好的元素
3、当 j 为非0元素时,交换i j的元素
相向双指针
125. 验证回文串——相向双指针
1、字母统一小写,过滤字符
2、双指针指向前后,字母相等则不断移动
167. 两数之和 II - 输入有序数组
1、数据已排序
2、根据双指针所加指的大小移动指针
3、若=target,返回答案
4、若>target,right–
5、若<target,left++
15. 三数之和
1、数组排序
2、取第一个元素为target,注意去重
3、双指针取second和third,second=first+1,third=size()-1
4、若second+third的值等于first,加入答案,双指针同时移动去重
5、若second+third的值小于first,second++
6、若second+third的值大于first,third–
16. 最接近的三数之和
1、数组排序
2、双指针取second和third,second=first+1,third=size()-1
3、sum=first+second+third
4、维护与target差值最小的sum
18. 四数之和——三数之和加多一层
背向双指针
5. 最长回文子串
1、利用中心扩展,求该中心的最长回文串left-- right++
2、将字符串的每个字母当成扩展中心,注意扩展中心可能为1个数 或两个数
3、擂台法保持最大回文串首尾位置
4、根据首尾位置从原字符串截取答案
滑动窗口
3. 无重复字符的最长子串
1、字母出现次数为1,left++,出现次数变为0
2、字母出现次数为0,right++,出现次数变为1
3、返回right-left的最大值
二、思考与收获
1、三种类型指针的区别?
同向双指针:指针向同一边移动,但是移动条件不同
相向双指针:指针从两头出发,向中间靠近
背向双指针:指针从中间出发,向两边靠近
2、滑动窗口类似哪种类型的指针?
同向双指针
3、滑动窗口与同向双指针的区别?
同向双指针通常是左指针左边是维护好的数据,右指针右边是未处理的数据
滑动窗口通常是对左指针与右指针中间的元素作判断处理,决定移动哪个指针
4、三种类型的指针通常对应什么样的应用?
同向双指针:原地修改,将符合的元素移动到一边
相向双指针:回文串的判断,排序好的数组找target
背向双指针:中心扩展法