删除有序数组中的重复项

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法1

用双指针解决移动元素的问题:
0.长度不足1直接返回长度
1.fast指向的是待检查元素,slow指向的是将要被替换的元素(即正确元素所在位置的下一位)
2.待检查的元素不等于前一个元素时,说明其是一个新出现的不重复的元素,将其替换到slow slow++ fast++
3.待检查的元素等于前一个元素,不进行替换,继续检查 fast++
4.slow指向正确位置下一位 返回时返回正确位置slow-1 但需要返回的是长度而不是下标所以还要+1。也就是直接返回slow即可
代码:

public int removeDuplicates(int[] nums){
 int n = nums.length;
 if(nums.length < 2){
  return 1;
 }
 int fast = 1,slow = 1;
 while(fast < n){
  if(nums[fast] != nums[fast-1]){
   nums[slow] = nums[fast];
   slow++;
  }
  fast++;
 }
 return slow;
}

方法2

因为只考虑正确元素即可,在重复元素出现之后的正确元素,之前有几个重复元素,就前移多少位,可不使用双指针获得更快的速度
1.遍历一遍数组
2.用total记录重复元素
3.不是重复元素时,当前元素前移total位进行覆盖
4.返回总长-total
代码:

public static int removeDuplicates2(int[] nums){
 int res = nums.length;
 int total = 0;
 if(nums.length <= 1){
  return 1;
 }
 for (int i = 1; i<nums.length; i++) {
  if(nums[i] != nums[i - 1]){
   nums[i - total] = nums[i];
  }else{
   total++;
  }
 }
 return res - total;
}

posted @ 2021-10-06 11:56  芝芝与梅梅  阅读(114)  评论(0)    收藏  举报