題目 #
leetcode 80 - Remove Duplicates from Sorted Array II (題目說明請點連結)
題目簡述 #
給定一個排序好的整數陣列,移除重複的元素,使得每個元素最多出現兩次,並返回新的陣列長度。
Example 1:
Input: nums = [1,1,1,2,2,3]
Output: 5, nums = [1,1,2,2,3,_]
Explanation: 函數應該回傳 k = 5,nums 前五個元素為 1, 1, 2, 2, 3。後面的元素不重要,可以是任意值。Example 2:
Input: nums = [0,0,1,1,1,1,2,3,3]
Output: 7, nums = [0,0,1,1,2,3,3,_,_]
Explanation: 函數應該回傳 k = 7,nums 前七個元素為 0, 0, 1, 1, 2, 3, 3。後面的元素不重要,可以是任意值。解題思路 #
此題為 leetcode 26的變形,一樣能用Two pointor的方式去解,輸出的陣列 為,前K的排序好的數字且不能重複二次以上。
輸入為一個排序好的陣列,將nums陣列內容的前k的去除重複的數字由小到大排出,但允許重複最多二次。
首先初始化二個index作為比較的指針i、j,
i為到結束前作為遍歷指針直到最後一項結束,
j為判斷有是否有新的重複指針,就會將j所在的直放到該位置,
因為是排序好的陣列,只要與j-2位置陣列,判斷有相異就放上新的內容
| 步驟 | 陣列狀態 | 指針位置 | 操作說明 |
|---|---|---|---|
| Step 1 | [1,1,1,2,2,3] | i=2, j=2 | i從2開始,與j-2位置比較,相同所以不做任何操作 |
| [1,1,_,_,_,_] | 前兩個位置保持不變 | ||
| Step 2 | [1,1,1,2,2,3] | i=3, j=2 | 與j-2位置比較,不同,將2放入j位置 |
| [1,1,2,_,_,_] | i=3, j=3 | j指針移動到下一個位置 | |
| Step 3 | [1,1,1,2,2,3] | i=4, j=3 | 與j-2位置比較,不同,將2放入j位置 |
| [1,1,2,2,_,_] | i=4, j=4 | j指針移動到下一個位置 | |
| Step 4 | [1,1,1,2,2,3] | i=5, j=4 | 與j-2位置比較,不同,將3放入j位置 |
| [1,1,2,2,3,_] | i=5, j=5 | j指針移動到下一個位置 | |
| Step 5 | [1,1,2,2,3,3] | 遍歷完成,返回j=5 |
Function 只要回傳相異的K即可。
完整程式碼 #
java
class Solution {
public int removeDuplicates(int[] nums) {
int j = 2; // 初始化指針j,從索引2開始,因為前兩個元素可以保留
for (int i = 2; i < nums.length; i++) { // 從第三個元素開始遍歷
if (nums[i] != nums[j - 2]) { // 如果當前元素與j-2位置的元素不同
nums[j] = nums[i]; // 將當前元素移動到j位置
j++; // 移動j指針到下一個位置
}
}
return j; // 返回去除重複元素後的數組長度
}
}時間複雜度 #
- 時間複雜度:O(n),其中 n 是數組的長度
- 空間複雜度:O(1),只使用了常數額外空間