###### tags: `Leetcode` `medium` `pointer` `python` # 80. Remove Duplicates from Sorted Array II ## [題目連結:]https://leetcode.com/problems/remove-duplicates-from-sorted-array-ii/ ## 題目: Given an integer array ```nums``` sorted in **non-decreasing order**, remove some duplicates ```in-place``` such that each unique element appears at **most twice**. The **relative order** of the elements should be kept the **same**. Since it is impossible to change the length of the array in some languages, you must instead have the result be placed in the **first part** of the array ```nums```. More formally, if there are ```k``` elements after removing the duplicates, then the first ```k``` elements of nums should hold the final result. It does not matter what you leave beyond the first ```k``` elements. Return ```k``` after placing the final result in the first ```k``` slots of ```nums```. Do **not** allocate extra space for another array. You must do this by **modifying the input array** ```in-place``` with **O(1) extra memory**. **Custom Judge:** The judge will test your solution with the following code: ``` int[] nums = [...]; // Input array int[] expectedNums = [...]; // The expected answer with correct length int k = removeDuplicates(nums); // Calls your implementation assert k == expectedNums.length; for (int i = 0; i < k; i++) { assert nums[i] == expectedNums[i]; } ``` If all assertions pass, then your solution will be **accepted**. **Example 1:** ``` Input: nums = [1,1,1,2,2,3] Output: 5, nums = [1,1,2,2,3,_] Explanation: Your function should return k = 5, with the first five elements of nums being 1, 1, 2, 2 and 3 respectively. It does not matter what you leave beyond the returned k (hence they are underscores). ``` **Example 2:** ``` Input: nums = [0,0,1,1,1,1,2,3,3] Output: 7, nums = [0,0,1,1,2,3,3,_,_] Explanation: Your function should return k = 7, with the first seven elements of nums being 0, 0, 1, 1, 2, 3 and 3 respectively. It does not matter what you leave beyond the returned k (hence they are underscores). ``` ## 解題想法: * 題目為給一非遞減的數組 * 要求每個數字最多出現兩次 * 相同的數字必須相鄰 * return 刪除多餘的數字後的長度 * modify in-place O(1) extra memory. * 往pointer思考 * 想法: * 設2個pointer: * fast=0 * 正常遍歷所有數字 * slow=0 * 指向多餘的第一個位置 * 當nums[fast]遍歷到新的數 * 此新數與nums[slow-2] * 不相同時,表示該新字數不為重複, * 將其取代nums[slow] * fast、slow皆向後移動 * 否則,continue讓fast繼續正常移動 * trace: nums=[1,1,1,2,2,3] ``` ans: nums[fast]==nums[slow-2] : slow停 f 1 1 1 2 2 3 s ans: nums[fast]!=nums[slow-2]: 將nums[fast]取代nums[slow] 兩pointer均移動 (2取代1) f '1' 1 1 '2' 2 3 s ans: nums[fast]!=nums[slow-2]: 將nums[fast]取代nums[slow] 兩pointer均移動 (2取代2 沒差>< ) f 1 '1' 2 2 2 3 s ans: nums[fast]!=nums[slow-2]: 將nums[fast]取代nums[slow] 兩pointer均移動 (3取代2) f 1 1 '2' 2 2 3 s final: f 1 1 2 2 3 3 s (剛好slow所在pos為len(刪除重複後的nums)->[1,1,2,2,3]) ``` ## Python: ``` python= class Solution(object): def removeDuplicates(self, nums): """ :type nums: List[int] :rtype: int """ if len(nums)<3: return len(nums) #前面兩個位置(pos:0,1)的數正常保留,從2開始 fast=2 slow=2 for fast in range(2,len(nums)): if nums[fast]==nums[slow-2]: continue else: nums[slow]=nums[fast] slow+=1 return slow result = Solution() nums = [1,1,1,2,2,3] ans = result.removeDuplicates(nums) print(ans,nums) ```