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

