天天看點

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;
    }
}