給定一個排序數組,你須要在原地刪除重複出現的元素,使得每一個元素最多出現兩次,返回移除後數組的新長度。
不要使用額外的數組空間,你必須在原地修改輸入數組並在使用 O(1) 額外空間的條件下完成。java
示例 1:
給定 nums = [1,1,1,2,2,3],
函數應返回新長度 length = 5, 而且原數組的前五個元素被修改成 1, 1, 2, 2, 3 。
你不須要考慮數組中超出新長度後面的元素。數組
示例 2:
給定 nums = [0,0,1,1,1,1,2,3,3],
函數應返回新長度 length = 7, 而且原數組的前五個元素被修改成 0, 0, 1, 1, 2, 3, 3 。
你不須要考慮數組中超出新長度後面的元素。
說明:
爲何返回數值是整數,但輸出的答案是數組呢?
請注意,輸入數組是以「引用」方式傳遞的,這意味着在函數裏修改輸入數組對於調用者是可見的。函數
你能夠想象內部操做以下:spa
// nums 是以「引用」方式傳遞的。也就是說,不對實參作任何拷貝 int len = removeDuplicates(nums); // 在函數裏修改輸入數組對於調用者是可見的。 // 根據你的函數返回的長度, 它會打印出數組中該長度範圍內的全部元素。 for (int i = 0; i < len; i++) { print(nums[i]); }
這是一類問題,由於有序才能去除重複項,咱們須要一個變量cnt去記錄出現了多少詞重複的元素,若是咱們遍歷的時候遇到的元素不一樣,把這個變量設置成1,從頭開始急速,若是已經超過了k個,那麼久跳過去。因此這裏給出了最多重複k個的一個方法。code
class Solution { public int removeDuplicates(int[] nums) { return removeDuplicates(nums, nums.length, 2); } int removeDuplicates(int A[], int n, int k) { if (n <= k) return n; int lengthIndex = 1; int cnt = 1; for (int j = 1; j < n; j++) { if (A[j] != A[j - 1]) { cnt = 1; A[lengthIndex++] = A[j]; } else { if (cnt < k) { A[lengthIndex++] = A[j]; cnt++; } } } return lengthIndex; } }
class Solution: def removeDuplicates(self, nums): """ :type nums: List[int] :rtype: int """ return self.removeDuplicatesHelper(nums, len(nums), 2) def removeDuplicatesHelper(self, A, n, k): if n <= k: return n lengthIndex = 1 cnt = 1 for j in range(1, n): if A[j] != A[j - 1]: cnt = 1 A[lengthIndex] = A[j] lengthIndex += 1 else: if cnt < k: A[lengthIndex] = A[j] cnt += 1 lengthIndex += 1 return lengthIndex
空間複雜度:o(1)
時間複雜度:o(n)排序