1. 程式人生 > 實用技巧 >LeetCode 80 刪除陣列中的重複項

LeetCode 80 刪除陣列中的重複項

LeetCode80 刪除陣列中的重複項

題目描述

給定一個增序排列陣列 nums ,你需要在 原地 刪除重複出現的元素,使得每個元素最多出現兩次,返回移除後陣列的新長度。

不要使用額外的陣列空間,你必須在 原地 修改輸入陣列 並在使用 O(1) 額外空間的條件下完成。

樣例

輸入:nums = [1,1,1,2,2,3]
輸出:5, nums = [1,1,2,2,3]
解釋:函式應返回新長度 length = 5, 並且原陣列的前五個元素被修改為 1, 1, 2, 2, 3 。

你不需要考慮陣列中超出新長度後面的元素。

輸入:nums = [0,0,1,1,1,1,2,3,3]
輸出:7, nums = [0,0,1,1,2,3,3]
解釋:函式應返回新長度 length = 7, 並且原陣列的前五個元素被修改為0, 0, 1, 1, 2, 3, 3 。

你不需要考慮陣列中超出新長度後面的元素。

演算法分析

  • 從前往後掃描
  • k表示新的陣列的長度,合法符合要求的新陣列
  • 列舉每個不同元素,相同元素的區間[i,j]
    • 區間長度 1, nums[k++] = nums[i]
    • 區間長度2,或大於二, num[k++] = nums[i] 也最多執行兩次
  • i 跳到 j (下一個數字,統計個數)

時間複雜度

\(O(n)\)

Java程式碼

class Solution {
    public int removeDuplicates(int[] nums) {
        int k = 0;
        for(int i = 0; i < nums.length; ){
            int j = i;
            while(j < nums.length && nums[j]==nums[i]){
                j++;
            }
            nums[k++] = nums[i];
            if(j - i >= 2){
                nums[k++] = nums[i];
            }

            i = j ;
        }

        return k;
    }
}