双指针算法处理的问题
- 在序列中寻找满足要求的多个数。(类似“两、三数和”等)
- 验证序列是否满足某种条件。(类似”回文、交错“等)
- 按照条件对序列进行划分。(划分成两区间、多区间等)
代码注意事项
-
两数和的题目(two sum)
==,<=,> target,不同情况不同边界的判断语句不同;
不同组合unique pairs的题目,去重方式是在产生一个结果后立刻跳过相同元素,不能在开头提前去重;
求两数和最接近目标值的题目,是对前缀和prefixSum进行排序之后,求相邻差值最小的情况;
两数差等于目标值的题目,是使用同向双指针的方式,类似扯橡皮筋。 -
划分区间的题目(partition)
quick select算法,相当于半个quick sort算法;
分成两分区,quick sort走一遍即可,不用递归;
分成三分区,需要多一个用于遍历的游标index。 -
颜色排序(sort)
彩虹排序,分治思想,其实也算是划分区间题目的一种类型;
索引范围(start,end)按照快速排序处理;
排序范围(colorFrom,colorTo)按照归并排序处理;
时间复杂度O(nlogk),n为索引范围,k为排序范围。
时间复杂度分析
单独的双指针算法的时间复杂度只有O(n)
,但是能够使用双指针的情况可能会需要提前排序或者做一些其它处理,这些前处理的时间复杂度可能会超过双指针算法的复杂度,可以根据具体的实际情况进行分析。
题目汇总
- 移动零(Move Zeroes)https://blog.csdn.net/SeeDoubleU/article/details/124600762
- 去除重复元素(Remove Duplicate Numbers in Array)https://blog.csdn.net/SeeDoubleU/article/details/124600771
- 移除多余字符(Remove Duplicate Letters)https://blog.csdn.net/SeeDoubleU/article/details/124600779
- 有效回文串(Valid Palindrome)https://blog.csdn.net/SeeDoubleU/article/details/124600788
- 旋转字符串(Rotate String)https://blog.csdn.net/SeeDoubleU/article/details/124600800
- 恢复旋转排序数组(Recover Rotated Sorted Array)https://blog.csdn.net/SeeDoubleU/article/details/124600809
- 两数之和(Two Sum)https://blog.csdn.net/SeeDoubleU/article/details/124619831
- 两数之和-输入已排序的数组(Two Sum II - Input array is sorted)https://blog.csdn.net/SeeDoubleU/article/details/124619856
- 两数之和-数据结构设计(Two Sum III - Data structure design)https://blog.csdn.net/SeeDoubleU/article/details/124619908
- 两数之和-不同组成(Two Sum - Unique pairs)https://blog.csdn.net/SeeDoubleU/article/details/124619944
- 三数之和(3Sum)https://blog.csdn.net/SeeDoubleU/article/details/124619956
- 三角形计数(Triangle Count)https://blog.csdn.net/SeeDoubleU/article/details/124621712
- 两数和-小于或等于目标值(Two Sum - Less than or equal to target)https://blog.csdn.net/SeeDoubleU/article/details/124621739
- 两数和-大于目标值(Two Sum - Greater than target)https://blog.csdn.net/SeeDoubleU/article/details/124621757
- 两数和-最接近值(Two Sum - Closest to target)https://blog.csdn.net/SeeDoubleU/article/details/124621765
- 最接近的三数之和(3Sum Closest)https://blog.csdn.net/SeeDoubleU/article/details/124621850
- 两数和-差等于目标值(Two Sum - Difference equals to target)https://blog.csdn.net/SeeDoubleU/article/details/124621877
- 数组划分(Partition Array)https://blog.csdn.net/SeeDoubleU/article/details/124642255
- 无序数组K小元素(Kth Smallest Numbers in Unsorted Array)https://blog.csdn.net/SeeDoubleU/article/details/124642270
- 第k大元素(Kth Largest Element)https://blog.csdn.net/SeeDoubleU/article/details/124642277
- 奇偶分割数组(Partition Array by Odd and Even)https://blog.csdn.net/SeeDoubleU/article/details/124642282
- 字符大小写排序(Sort Letters by Case)https://blog.csdn.net/SeeDoubleU/article/details/124642285
- 交错正负数(Interleaving Positive and Negative Numbers)https://blog.csdn.net/SeeDoubleU/article/details/124642293
- 颜色分类-荷兰旗问题(Sort Colors)https://blog.csdn.net/SeeDoubleU/article/details/124642303
- 颜色分类II-彩虹排序(Sort Colors II)https://blog.csdn.net/SeeDoubleU/article/details/124642346