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;
    }
结果
 
    欢迎访问csdn的博客:
https://blog.csdn.net/kangshihang1998?spm=1010.2135.3001.5343
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号