>[success] # 80. 刪除有序數組中的重復項 II
* 描述
給你一個有序數組 nums ,請你 原地 刪除重復出現的元素,使得出現次數超過兩次的元素只出現兩次 ,返回刪除后數組的新長度。
不要使用額外的數組空間,你必須在 原地 修改輸入數組 并在使用 O(1) 額外空間的條件下完成。
* 示例 1:
~~~
輸入:nums = [1,1,1,2,2,3]
輸出:5, nums = [1,1,2,2,3]
解釋:函數應返回新長度 length = 5, 并且原數組的前五個元素被修改為 1, 1, 2, 2, 3 。 不需要考慮數組中超出新長度后面的元素。
~~~
* 示例 2:
~~~
輸入: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 。 不需要考慮數組中超出新長度后面的元素。
~~~
來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
>[info] ## 快慢指針解法
* 和26題比較類似,最多只能出現兩次,因此比較時候要向當前快指針和慢指針所在位置前兩個比較如果相同說明已經出現三次否則說明符合兩次

>[danger] ##### js
~~~
var removeDuplicates = function(nums) {
let fast = 2
let slow = 2
while(fast<nums.length){
// 如果當前值 不等于往前的兩值說明符合最多兩個相同
if(nums[fast] !== nums[slow-2]){
nums[slow] = nums[fast]
slow++
}
fast++
}
return slow
};
~~~
>[danger] ##### java
~~~
class Solution {
public int removeDuplicates(int[] nums) {
int fast = 2;
int slow = 2;
while(fast < nums.length){
if(nums[fast]!=nums[slow-2]){
nums[slow] = nums[fast];
slow++;
}
fast ++;
}
return slow;
}
}
~~~
- 刷題準備
- 統計數組中元素出現次數
- Leetcode -- 442數組中重復的數據
- leetcode -- 448 找到所有數組中消失的數字
- 字符類似題
- Leetcode -- 1002 查找共用字符
- Leetcode -- 1370上升下降字符串
- 指針類題解
- Leetcode -- 283 移動零
- Leetcode -- 26. 刪除有序數組中的重復項
- Leetcode -- 80. 刪除有序數組中的重復項 II
- Leetcode -- 27. 移除元素
- Leetcode -- 344. 反轉字符串
- Leetcode -- 125 驗證回文串
- Leetcode -- 11 盛最多水的容器
- Leetcode -- 1480. 一維數組的動態和