双指针总结篇


双指针这种思想对于解决数组类问题是很重要的,一般来讲可以将时间复杂度控制在O(N),我将其分为三类,双指针之快慢指针、双指针之对撞指针、双指针之滑动窗口。注意这里的指针并不是c语言里面的指针,而是数组下标(索引)

双指针之快慢指针

基本思想:快指针fast,慢指针slow都指向数组第一个元素,其中fast用来遍历整个数组,一旦fast发现满足条件的元素,就与slow指向元素进行某种操作(交换,赋值等等),slow往后移动,直至快指针fast遍历完整个数组,时间复杂度O(N)

应用场景:

  1. in place (原地解决问题 不需要额外的空间)
  2. 在数组中寻找特定的元素(大于等于小于target,或在某个范围内等等),将其放到[0,slow)这个左闭右开的区间
  3. 在数组有序的状态 对数组进行去重(去重复元素,不需要额外的空间)
  4. 待补充
题目 类型 题目链接 详细解答
283.Move Zeroes 双指针之快慢指针 点击这里 点击这里
27.Remove Element 双指针之快慢指针 点击这里 点击这里
26.Remove Duplicates from Sorted Array 双指针之快慢指针 点击这里 点击这里
80.Remove Duplicates from Sorted Array II 双指针之快慢指针 点击这里 点击这里

双指针之对撞指针

基本思想: 两个指针i,j,i指向数组最左边,j指向数组最右边,i从左往右遍历,j从右往左遍历,当满足某某条件时,进行某某操作,直至两者相遇,时间复杂度O(N)

应用场景:

  1. 判断一个字符串是否对称、回文数,翻转字符串(也可以交换特定位置的字符)
  2. 数组有序的状态,看哪两数相加,减等等,其结果是否大于等于小于target(N sum类问题)
  3. 二路快速排序
  4. 待补充
题目 类型 题目链接 详细解答
167. Two Sum II - Input array is sorted 双指针之对撞指针 点击这里 点击这里
125. Valid Palindrome 双指针之对撞指针 点击这里 点击这里
344. Reverse String 双指针之对撞指针 点击这里 点击这里
345. Reverse Vowels of a String 双指针之对撞指针 点击这里 点击这里
11. Container With Most Water 双指针之对撞指针 点击这里 点击这里

双指针之滑动窗口

基本思想:初始时指针left,right都指向数组第一个元素,维持[left,right)这个窗口,

题目 类型 题目链接 详细解答
209. Minimum Size Subarray Sum 双指针之滑动窗口 点击这里 点击这里
3. Longest Substring Without Repeating Characters 双指针之滑动窗口 点击这里 点击这里
438. Find All Anagrams in a String 双指针之滑动窗口 点击这里 点击这里
76. Minimum Window Substring 双指针之滑动窗口 点击这里 点击这里

总结

跟数组有关的时候 并且是查找类型 要想到双指针和二分法

文章目录
  1. 1. 双指针之快慢指针
  2. 2. 双指针之对撞指针
  3. 3. 双指针之滑动窗口
  4. 4. 总结
|