概念
双指针是在遍历的过程中,使用两个方向相同或相反的指针进行扫描,从而达到相应目的的算法。
广义上来说,双指针是指用两个变量在线性结构上遍历而解决的问题。
狭义上说:
- 对于数组,指两个变量在数组上相向移动解决的问题;
- 对于链表,指两个变量在链表上同向移动解决的问题,也称为「快慢指针」问题。
双指针问题
对撞指针
对撞指针将最左侧的索引定义为左指针(left),最右侧的定义为右指针(right),从两头向中间进行数组遍历
对撞指针适用于有序的数组和字符串
对撞指针的时间复杂度为 O ( n ) O(n) O(n)
此题要求分奇偶调整数组的顺序,我们可以用左指针寻找奇数,右指针寻找偶数,当左指针找到偶数且右指针找到奇数时,对调两数。代码如下
vector<int> exchange(vector<int>& nums) {
int l = 0, r = nums.size() - 1;
while (l < r) {
while(l < r && nums[l] % 2 == 1) l++;
while(l < r && nums[r] % 2 == 0) r--;
swap(nums[l], nums[r]);
}
return nums;
}
此题要求寻找和为 t a r g e t target target数对,由于此题数组已经做好排序,我们可以确定
若数对 ( n u m s [ i + 1 ] , n u m s [ j ] ) < t a r g e t (nums[i+1],nums[j])<target (nums[i+1],nums[j])<target
则必有 ( n u m s [ i ] , n u m s