一、定义
双指针技巧主要分为两类:左右指针和快慢指针。所谓左右指针,就是两个指针相向而行或者相背而行;而所谓快慢指针,就是两个指针同向而行,一快一慢。
只要数组是有序的,或者是需要原地操作数组,都应该想到双指针技巧。
二、快慢指针
通常用于在有序数组/链表中去重,或者是对数组中的某些元素原地修改。
1、有序数组去重
slow指针为新数组(去重后的数组)的当前位置,而fast指针为原数组nums的当前位置。fast指针遍历原数组,当遇到新数组没有的元素就加入(即替换nums[slow] = nums[fast])slow指针向后走。因为数组是有序的,所以只需对比nums[fast]和nums[fast-1]是否相等就可以判断是否已经加入新数组(nums[fast-1]肯定比nums[fast]先加入)。
2、原地修改数组
与上题类似,slow指针为新数组(去重后的数组)的当前位置,而fast指针为原数组nums的当前位置。
三、左右指针
前提是数组有序
例题有二分查找、两数之和、反转数组、回文串,这些题目都是比较明显可以看出需要使用左右指针的。
四、滑动窗口
滑动窗口其实是快慢指针的一种,但这里单独拿出来,是因为滑动窗口常用于求连续的子数组或子串,与前面的适用场景不同。
解题模板:
int left = 0, right = 0; while (right < s.size()) { // 增大窗口 window.add(s[right]); right++; while (window needs shrink) { // 缩小窗口 window.remove(s[left]); left++; } }
参考:labuladong 的算法小抄
标签:slow,nums,fast,right,数组,指针 From: https://www.cnblogs.com/cxuep/p/16653978.html