###### 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)
```