給定**已排序**數組,原地移除重複元素,使每個元素只出現一次,返回新長度。要求 O(1) 額外空間。
slow 指向當前不重複部分的末尾(下一個唯一值的寫入位置)。fast 遍歷數組。nums[fast] != nums[slow],則 slow++,nums[slow] = nums[fast]。最終新長度 = slow + 1。
int removeDuplicates(int* nums, int numsSize) {
if (numsSize == 0) return 0;
int slow = 0;
for (int fast = 1; fast < numsSize; ++fast) {
if (nums[fast] != nums[slow]) {
nums[++slow] = nums[fast];
}
}
return slow + 1;
}
O(n log n)),再用上述方法。HashSet 記錄已見元素,O(n) 時間,O(n) 空間。本題關鍵在於利用「已排序」特性,線性掃描即可完成去重。