力扣80——刪除排序數組中的重複項 II
- 2019 年 12 月 31 日
- 筆記
原題
給定一個排序數組,你需要在原地刪除重複出現的元素,使得每個元素最多出現兩次,返回移除後數組的新長度。
不要使用額外的數組空間,你必須在原地修改輸入數組並在使用 O(1) 額外空間的條件下完成。
示例 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 。 你不需要考慮數組中超出新長度後面的元素。
說明:
為什麼返回數值是整數,但輸出的答案是數組呢?
請注意,輸入數組是以「引用」方式傳遞的,這意味著在函數里修改輸入數組對於調用者是可見的。
你可以想像內部操作如下:
// nums 是以「引用」方式傳遞的。也就是說,不對實參做任何拷貝 int len = removeDuplicates(nums); // 在函數里修改輸入數組對於調用者是可見的。 // 根據你的函數返回的長度, 它會列印出數組中該長度範圍內的所有元素。 for (int i = 0; i < len; i++) { print(nums[i]); }
原題url:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/
解題
本題比較噁心的地方在於針對重複的數字,可以最多留2個,而並不是全部刪除,因此在這點上需要注意。可以用一個專門的變數記錄當前數字重複的次數,當重複次數大於2的時候則直接刪除該數字,當不同後,再將該變數重置。
讓我們看一下程式碼:
class Solution { public int removeDuplicates(int[] nums) { if (nums.length <= 1) { return nums.length; } int start = 1, current = 1; // 已經出現過的數字before,及其出現的次數 int before = nums[0]; int times = 1; while (current < nums.length) { // 相同並且超過2個,則直接跳過 if (nums[current] == before && times == 2) { current++; continue; } // 相同但是不超過2個 // 如果和之前一個數相同,則增加times if (nums[current] == before) { times++; } // 如果不相同,則重置times else { times = 1; } // 賦值,即拷貝該數到合適的位置 nums[start] = nums[current]; before = nums[current]; // 移動指針 current++; start++; } return start; } }
提交OK,執行用時:1 ms
,記憶體消耗:37.3 MB
。應該沒什麼問題了。
總結
以上就是這道題目我的解答過程了,不知道大家是否理解了。
這已經是第9篇刷題的文章了,都是 medium 難度,感覺 medium 難度的話,重點關注的是一些邊界判斷,思考是否嚴謹,至於演算法,還是比較基礎的。不知道大家感覺如何。
有興趣的話可以訪問我的部落格或者關注我的公眾號,說不定會有意外的驚喜。
https://death00.github.io/