天天看点

leetcode刷题题解——26. 删除有序数组中的重复项删除有序数组中的重复项

删除有序数组中的重复项

方法一:自己写的答案

思路:

  • 把数组的长度赋值给len
  • 进入循环,不是最后一个值则判断是否重复,重复则将后续的值依次往前挪,将重复值覆盖,len–
  • nums[j]–的原因时,j-1当前已经时最后一个值的索引了,但是后续数值并没有删除,当nums[j-1]==nums[j]的时候将会陷入死循环,所以需要修改后续的值,至于为什么是自减1,是因为给数组是递增的,自减1才不会与前面的值重复
  • 同时考虑可能有多个重复值,使用while循环
  • 返回len
class Solution {
    public int removeDuplicates(int[] nums) {
        int len = nums.length;
        for (int i=0;i<len;i++){
            if (i<len-1) {
                while (nums[i]==nums[i+1]){
                    int j = i+1;
                    while (j<len-1){
                        nums[j] = nums[j+1];
                        j++;
                    }
                    nums[j]--;
                    len--;
                }
            }
        }
        return len;
    }
}
           

方法二:看了下评论区的c++答案,使用java实现

思路:利用一个新的索引len抽象出一个新的数组

  • 将len=0,即给虚拟新数组nums[0]赋值,因为nums不用考虑是否重复,可以直接赋值
  • 将索引1及后面的值,都与nums[len]比较,如果不重复,则将给nums[len+1]赋值当前nums[i]的值,如果重复,不做操作,相当于没有给新数组加入重复值,同时保持len的值时虚拟数组最后一个值的索引
  • 由于数组长度为数组最后一个值的索引+1,返回len+1
class Solution {
    public int removeDuplicates(int[] nums) {
        if (nums.length<2) return nums.length; 
        int len = 0;
        for (int i=1;i<nums.length;i++){
            if (nums[len]!=nums[i]) nums[++len] = nums[i];
        }
        return ++len;
    }
}