首尾指针:范围查找,比如二分搜索等
滑动窗口:指针处在数组同一方向,根据条件移动左右指针,用于获取范围和等
快慢指针: 多用于链表计算时,判断是否有环等
1 双指针
1.1 滑动窗口
和大于等于 target 的最短子数组
-
问题特质:连续片段(尽量不用动态规划,用一个total就可以记录)
-
解题方法:专门设置有left, right, total等
-
复杂度:O(n)
乘积小于 K 的子数组
这个题和上一个的区别是要计算,这样的数组出现的个数
1.2 快慢指针
判断是否存在环
2 前缀和
-
问题特质:连续片段
-
[i][j]之间的和可以用前缀d[j] - d[i]表示
但是用到前缀和可能复杂度会相比滑动窗口增加
前缀和的方法,可以写出i,j递推公式之后,进行优化(例如借助hash进行优化等)
3 暴力
例题:回旋镖的数量
使用一个拐点,寻找任意两个点,他们到拐点的距离相等。可以使用暴力:
for(auto 拐点 :all_points){
for( auto p : all_points){
// 使用一个hash值记录不同的距离分别对应的点的个数
hash[distance] ++;
}
// 计算数目即可
for(key: hash){ ans += value*(value-1)}
}