双指针
核心思想
双指针是一种思想,它可以用来优化暴力
通过两个指针维护一些具有单调性,可快速增删的区间信息,将时间复杂度大幅度降低
例如快速排序使用了双指针的思想,将时间复杂度降低到了
不通用模板
1 | for (int i = 1, j=1;i<=n;i++){ |
快慢指针
最长连续不重复序列
给定一长度为n的整数序列,找出最长的不包含重复的数的连续区间,输出长度
输入例
1
2 5
1 2 2 3 5输出例
1 3
传统思想为用二重循环从头开始遍历,直到找到一个区间中间没用重复元素
### 图解
如两个指针(不是分配内存的指针)同时指向头部
i先移动,将指到的数出现次数加一,同时满足此时为一个不重复序列,更新答案i-j+1
当i移动到第二个2,记录了两次相同数字,这时i与j之间的数列不符合条件,让j移动到i处
移动后将前面的序列抛弃,且将每个数重新计数以寻找下一子序列
代码实现
1 | // 给定一长度为n的整数序列,找出最长的不包含重复的数的连续区间,输出长度 |
对撞指针
对撞指针的思想:左右两个指针向中间寻找知道对撞
用对撞指针实现快速排序
- 将数组最后一个数right作为基数key
- 从首元素begin开始向后寻找比key大的数,end开始向前寻找比key小的数,找到后两者交换
- 直到begin>=end终止遍历
- 将begin和最后一个数交换,此时key作为中间数,左边都比key小右边都比key大
- 递归对左右区间重复操作,直到剩一个元素
代码:
1 |
|