一、双指针法
二分查找,滑动窗口都是双指针法的应用。
只要遇见在序列中查找某值,或者搜索出特定子集,都可以首先考虑双指针法。因为既容易思考,又比嵌套循环的时间复杂度低,其通常是O(n)。
思路:
1、两个指针的起始位置(一左一右or同时在左or同时在右?)
2、指针储存的数据:索引
3、指针移动的条件(左指针和右指针移动的条件不一定相同)
4、退出循环的情况(当指针重叠时如何处理?)
二、应用
1、二分查找
思路:
1、两个指针的起始位置(一左一右or同时在左or同时在右?):一左一右
2、指针储存的数据(是元素本身or元素索引?):索引
3、指针移动的条件(左指针和右指针移动的条件不一定相同):若target大于中间值,则left = 中间值+1,否则right = 中间值-1
4、退出循环的情况(当指针重叠时如何处理?):找到target或者左右指针重叠(没找到)
2、滑动窗口
思路:
1、两个指针的起始位置(一左一右or同时在左or同时在右?):同时在左
2、指针储存的数据(是元素本身or元素索引?):索引
3、指针移动的条件(左指针和右指针移动的条件不一定相同):若sum不够target移动右指针(即:扩展子序列);否则,移动左指针(即:缩短子序列)
4、退出循环的情况(当指针重叠时如何处理?):右指针等于len-1
过程中,记录满足条件的最小序列长度。
三、总结
1、两个指针的起始位置(一左一右or同时在左or同时在右?)
一左一右:一般是采用贪心算法来移动左右指针,无法遍历完整个情况
同时在左or同时在右:这种两个指针会同时遍历完整个序列
2、指针储存的数据(是元素本身or元素索引?)
一定是储存索引,这样才能方便移动。(我老是第一反应是元素本身,所以单独把这条列出来提醒自己)
3、指针移动的条件(左指针和右指针移动的条件不一定相同)
按照题目情况来思考
4、退出循环的情况(当指针重叠时如何处理?)
待补充