双指针这种思想对于解决数组类问题是很重要的,一般来讲可以将时间复杂度控制在O(N)
,我将其分为三类,双指针之快慢指针、双指针之对撞指针、双指针之滑动窗口。注意这里的指针并不是c语言里面的指针,而是数组下标(索引)
双指针之快慢指针
基本思想:
快指针fast,慢指针slow都指向数组第一个元素,其中fast用来遍历整个数组,一旦fast发现满足条件的元素,就与slow指向元素进行某种操作(交换,赋值等等),slow往后移动,直至快指针fast遍历完整个数组,时间复杂度O(N)
应用场景:
- in place (原地解决问题 不需要额外的空间)
- 在数组中寻找特定的元素(大于等于小于target,或在某个范围内等等),将其放到[0,slow)这个左闭右开的区间
- 在数组有序的状态 对数组进行去重(去重复元素,不需要额外的空间)
- 待补充
题目 | 类型 | 题目链接 | 详细解答 |
---|---|---|---|
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)
应用场景:
- 判断一个字符串是否对称、回文数,翻转字符串(也可以交换特定位置的字符)
- 数组有序的状态,看哪两数相加,减等等,其结果是否大于等于小于target(N sum类问题)
- 二路快速排序
- 待补充
题目 | 类型 | 题目链接 | 详细解答 |
---|---|---|---|
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 | 双指针之滑动窗口 | 点击这里 | 点击这里 |
总结
跟数组有关的时候 并且是查找类型 要想到双指针和二分法