26. 删除有序数组中的重复项-双指针实现方式--LeetCode

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

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

将最终结果插入 nums 的前 k 个位置后返回 k 。

不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

个人题目理解:
根据题目描述,给定一个有序数组,在不使用额外空间的情况下。把数组里的重复元素给删除了。这里比较容易混淆的点是,不一定非得删除其他元素。而是可以把不重复的元素往前放。

思路
根据我的个人理解,数组元素的其他位置是可以被覆盖的,所以我使用了双指针,一个慢指针,和一个快指针。慢指针用于确定要被覆盖的元素位置,而快指针是用于扫描不重复的元素。然后把不重复的元素赋值给 慢指针+1的位置,一次类推。就可以把所有不重复的元素给排到数组的前几个。
因为每找到一个不重复元素,慢指针都加一,所以最后返回慢指针+1 就是整个有序数组的去重之后的长度。
慢指针 +1 是因为索引是从零开始的所以把零也算上

用例

   public static void main(String[] args) {

     //示例1
      int[]  nums = new int[]{1,1,2};
      int[]  nums1 = new int[]{0,0,1,1,1,2,2,3,3,4};
        int i = removeDuplicates(nums1);
        System.out.println(i);

    }

代码实现

  public static int removeDuplicates(int[] nums) {
            int left=0; //相对固定索引 和 每次循环都变的值right对比
            for (int right = 0; right < nums.length; right++) {
                if(nums[right]!=nums[left]){
                    //把不相等的值赋值给,left后面的元素

                    nums[left+1]=nums[right];
                    //索引加一
                    left++;
                }
            }
            return left+1;
    }

结果
在这里插入图片描述

posted @ 2022-07-31 17:25  康世行  阅读(17)  评论(0编辑  收藏  举报