LeetCode 80 刪除陣列中的重複項
阿新 • • 發佈:2020-11-19
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; } }