第 8 章
删除有序数组中的重复项
·约 2 分钟
🟢 Easy · 🏷️ 数组、双指针 · LeetCode#26
📖 题目
原地删除升序数组里的重复元素,让每个元素只出现一次,返回新长度。
| 输入 | 输出 |
|---|---|
nums=[0,0,1,1,1,2,2,3,3,4] | 5,nums=[0,1,2,3,4,...] |
💡 思路
还是移动零那套快慢双指针,保留条件从"不等于某个值"换成了"不等于前一个元素"——数组有序,重复元素一定相邻,只要跟前一个比就够了。
跟前面两题还有个区别:slow 从 1 开始,不是 0。第一个元素不可能重复,肯定保留,slow=1 表示"下一个不重复元素该放的位置从索引 1 开始"。
💻 代码
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
if not nums:
return 0
slow = 1
for fast in range(1, len(nums)):
if nums[fast] != nums[fast - 1]:
nums[slow] = nums[fast]
slow += 1
return slow
时间复杂度 O(n),空间复杂度 O(1)。
🔀 跟移动零、移除元素对比
| 移动零 | 移除元素 | 这题 | |
|---|---|---|---|
| 保留条件 | != 0 | != val | != nums[fast-1] |
| slow 起点 | 0 | 0 | 1 |
| 比较对象 | 固定值 | 固定值 | 前一个元素 |