删除排序数组中的重复项
数组 双指针题目描述
给定一个已排序的数组 nums,你需要 原地 删除重复出现的元素,使得每个元素只出现一次,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须在 原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。
思路分析
由于数组是 已排序 的,重复的元素一定会相邻。我们可以利用这一特性,使用 双指针(快慢指针)法来解决。
- 慢指针 (slow):指向当前已确定的不重复序列的最后一个元素。
- 快指针 (fast):从第二个元素开始遍历整个数组,寻找与慢指针指向的元素不同的新值。
算法步骤
- 初始化:如果数组为空或长度为 0,直接返回 0。否则,设置
slow = 0。 - 遍历:快指针
fast从 1 开始遍历到数组末尾。 - 比较:
- 如果
nums[fast] !== nums[slow],说明找到了一个新的不重复元素。 - 此时将
slow向后移动一位 (slow++)。 - 将
nums[fast]的值赋给nums[slow]。
- 如果
- 结束:遍历完成后,
slow + 1即为不重复元素的个数(因为索引从 0 开始)。
示例代码
复杂度分析
- 时间复杂度:
O(n),其中n是数组的长度。我们只需要遍历一遍数组。 - 空间复杂度:
O(1),我们只使用了两个额外的索引变量。