題目
給定一個已經排序的整數陣列 nums,要求 就地 移除重複的元素,使得每個元素只出現一次,並返回新的長度 k。
必須保留相對順序,並且不能使用額外的陣列空間(必須在 O(1) 空間內完成)。
範例
Input: nums = [1,1,2]
Output: 2, nums = [1,2,_]
Explanation: 返回 k = 2,且前兩個元素為 1, 2,剩下的元素不需要關心。
Input: nums = [0,0,1,1,1,2,2,3,3,4]
Output: 5, nums = [0,1,2,3,4,,,,,_]
Explanation: 返回 k = 5,前五個元素為 0,1,2,3,4。
解題思路
這題適合用 雙指標法 解決:
第一個指標 i 負責遍歷陣列。
第二個指標 k 負責標記唯一元素的位置。
當 nums[i] != nums[i-1] 時,把該元素放到 nums[k],並移動 k。
時間複雜度:O(n)
空間複雜度:O(1)
程式碼(Java)
class Solution {
public int removeDuplicates(int[] nums) {
if (nums.length == 0) return 0;
int k = 1; // 第一個元素一定保留
for (int i = 1; i < nums.length; i++) {
if (nums[i] != nums[i - 1]) {
nums[k] = nums[i];
k++;
}
}
return k;
}
}
心得
這題看起來簡單,但其實是練習 雙指標技巧 的好題目。
雙指標可以讓我們在 O(n) 時間內就地處理陣列,避免額外空間浪費。
類似的技巧可以用在「刪除特定元素」、「合併排序陣列」等問題上,非常值得熟練掌握。