双指针问题(一) 对撞指针和快慢指针

本文介绍了双指针算法中的对撞指针和快慢指针概念。对撞指针用于有序数组和字符串,从两端向中间遍历,例如调整数组奇偶顺序、寻找和为目标值的数对。快慢指针常用于链表问题,如判断环形链表和找到环的入口,通过不同速度的指针移动来解决问题。文章提供了相关题目实例和解题代码。
摘要由CSDN通过智能技术生成

双指针问题(一) 对撞指针和快慢指针

概念

双指针是在遍历的过程中,使用两个方向相同或相反的指针进行扫描,从而达到相应目的的算法。

广义上来说,双指针是指用两个变量在线性结构上遍历而解决的问题。

狭义上说:

  • 对于数组,指两个变量在数组上相向移动解决的问题;
  • 对于链表,指两个变量在链表上同向移动解决的问题,也称为「快慢指针」问题。

双指针问题

对撞指针

对撞指针将最左侧的索引定义为左指针(left),最右侧的定义为右指针(right),从两头向中间进行数组遍历

对撞指针适用于有序的数组和字符串

对撞指针的时间复杂度为 O ( n ) O(n) O(n)

剑指 Offer 21

此题要求分奇偶调整数组的顺序,我们可以用左指针寻找奇数,右指针寻找偶数,当左指针找到偶数且右指针找到奇数时,对调两数。代码如下

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;
}

剑指 Offer 57

此题要求寻找和为 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值