双指针法的应用实战

双指针法的应用实战

什么是双指针?

  双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。

快慢指针示例:

26-删除排序数组中的重复项

  这里是定义快慢两个指针。快指针每次增长一个,慢指针只有当快指针上的值不同时,才增长一个(由于是有序数组,快慢指针值不等说明找到了新的值)

    public int removeDuplicates(int[] nums) {
        int k = 0;//在nums中[0,k]中的数字无重复
        //遍历第i个元素后,保证[0……i]中的所有不重复元素都
        //按照顺序排列在[0……k]中
        for (int i = 1; i < nums.length; i++)
            if(nums[i] != nums[k] )
                nums[++k] = nums[i];
        return k+1;
    }

27-移除元素

  该题也是定义快慢两个指针。快指针每次增长一个,慢指针只有当值不同时才增长一个。

   public int removeElement(int[] nums, int val) {
        int k = 0;//在nums中[0,k)中的数字不等于val
        //遍历第i个元素后,保证[0……i]中的所有不等于val的元素都
        //按照顺序排列在[0……k)中
        for(int i = 0;i < nums.length;i++) 
            if(nums[i] != val) {
                int temp = nums[i];
                nums[i] = nums[k];
                nums[k++] = temp;
            }
        return k;
    }

80-删除排序数组中的重复项 II

  该题为双指针问题的进阶版,设置了三个指针。一个快指针,一个慢指针,一个定位指针。快指针每次增长一个,当快指针与定位指针的值不同时,则更新定位指针的指向快指针。只要快指针与定位指针的距离小于2则慢指针增长一位。

    public int removeDuplicates2(int[] nums) {
        //在nums中[0,k)中的数字未重复两次以上
        //j作为开头的坐标,以计算重复的个数
        int j = 0,k = 0;
        //遍历第i个元素后,保证[0……i]中的所有未重复两次以上元素都
        //按照顺序排列在[0……k)中
        for (int i = 0; i < nums.length; i++) {
            //主要通过坐标定位,将超过两个以上的数字排除掉
            if(nums[i] != nums[j])
                j=i;
            if((i-j) < 2 )
                nums[k++] = nums[i];
        }
        return k;
    }
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务