26.删除有序数组中的重复项
题目:26. 删除有序数组中的重复项
给定一个非严格递增排列(即允许重复、但有序)的数组 nums
,要求原地删除重复元素,使每个元素只出现一次,并返回去重后数组的长度。
双指针法
由于数组已经有序,重复元素一定是连续的,这给我们用双指针法提供了便利。
我们使用两个指针:
fast
:快指针,负责遍历整个数组;slow
:慢指针,指向去重后数组的最后一个位置。
算法逻辑如下:
- 初始化
slow = 0
,表示当前去重数组的末尾; - 每次
nums[fast] != nums[slow]
,说明遇到新元素,将它放在slow + 1
位置,同时slow++
; - 最终返回
slow + 1
即为新数组长度。
代码实现
class Solution {
public:int removeDuplicates(vector<int>& nums) {if (nums.empty()) {return 0;}int slow = 0, fast = 0;while (fast != nums.size()) {if (nums[slow] != nums[fast]) {nums[++slow] = nums[fast];}fast++;}return slow + 1;}
};
示例演示
输入:
nums = [0,0,1,1,1,2,2,3,3,4]
执行过程(逐步覆盖):
fast 遇到新元素 -> 覆盖 slow + 1
最终 nums = [0,1,2,3,4,...]
返回值为 5
复杂度分析
- 时间复杂度:
O(n)
,每个元素最多遍历一次; - 空间复杂度:
O(1)
,在原数组上原地操作,无额外空间。