双指针套路

本文探讨了同向双指针和反向双指针算法在数组处理中的区别,如删除重复元素和保持位置一致性。同向双指针用于保持元素相对位置,反向双指针则不保留原始位置。通过实例和力扣26题解析,展示了如何在实际问题中灵活运用这两种技巧。
摘要由CSDN通过智能技术生成

双指针分为同向双指针反向双指针

同向双指针

其中 [0,i) 的数据代表处理好的数据,[i,j)中的数据是那些处理过但不需要的数据,[j,array.length) 区间的数据为接下来待处理的数据。这三个区间的开闭要根据题目要求定义,但是要保持一致(不能让一个端点值在一个区间的右边和另一个区间的左边都闭合)。

用此方法处理过的数组,处理好的数据的相对位置会保持一致 ,即[1,2,0,3,0,8] 将0移至数组尾部,使用此方法,结果只可能是[1,2,3,8,0,0]而不可能是[8,3,2,1,0,0] 或者其他

通用解题步骤

1. 初始化两个指针 i, j ,通常是两者都取0 或者两者都取 n

2. while(j < arr.length)

  •   如果需要array[j],通过将array[j]赋值给array[i],即 array[i]  = array[j],并且将 i 向前移,让其准备好下一个将要被赋值的位置
  • 否则跳过j,如果不满足条件,我们不必移动 i

反向双指针

其中 [0,i)  和 [j,array.length) 区间的数据的数据均代表处理好的数据,[i,j)中的数据待处理。用此方法处理过的数组不会保留原来元素的位置

通用解题步骤

1. 初始化两个指针 i = 0 , j = array.length - 1

2. while( i <= j )

  • 根据题意决定 array[i] 和 array[j] 的值(有可能是交换值,有可能是取较小的值等等)
  • 每次至少会有一个指针移动

示例:力扣26

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。

由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。

var removeDuplicates = function(nums) {
    var left = 0;
    var right = 0;
    var len = nums.length;
    while(right < nums.length){
        // 本题的突破口是重复元素的两项一定是相邻的
        if(nums[left] === nums[right]){
            right++
        }else if(nums[left] != nums[right]){
            nums[left+1] = nums[right]
            left++;
            right++;
        }
    }
    return left+1
};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值