implSolution{pubfnremove_duplicates(nums:&mutVec<i32>)->i32{letmutk=0;// 新数组长度,也是下一个写入位置foriin0..nums.len(){// 前两个元素直接保留;之后只有与已保留的倒数第二个不同才保留ifk<2||nums[i]!=nums[k-2]{nums[k]=nums[i];k+=1;}}kasi32}}思路:
· 数组有序,重复元素一定相邻。
· 用 k 表示新数组的长度,也指向下一个要写入的位置。
· 遍历原数组,如果当前元素 nums[i] 与已保留的倒数第二个元素 nums[k - 2] 不同,说明该元素出现次数还不到 2 次,可以保留。
· 否则跳过,最终 k 就是新数组长度。
时间复杂度 O(n),空间复杂度 O(1)。