删除有序数组中的重复项 -LeetCode
26. 删除有序数组中的重复项
🎯 问题描述(来源于LeetCode)
描述:
给你一个 非严格递增排列 的数组 nums,请你 原地 删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。
元素的相对顺序应该保持一致。
不要使用额外的数组空间,你必须在 原地 修改输入数组,并在使用 O(1) 额外空间的条件下完成。
说明:
- 数组已排序。
- 返回新长度
slow后,不需要考虑数组中超出新长度后面的元素。
示例:
- 示例 1:
1 | 输入: nums = [1,1,2] |
- 示例 2:
1 | 输入: nums = [0,0,1,1,1,2,2,3,3,4] |
💻 解题思路
思路:快慢指针(覆盖法)
算法步骤
- 如果数组长度为 0,直接返回 0。但代码中未处理空数组,不过题目保证
nums长度至少为 1。 - 初始化慢指针
slow = 1,指向下一个不重复元素应该放置的位置。 - 遍历数组,快指针
fast从 1 开始(0 位置默认保留):- 如果
nums[fast] != nums[slow-1](即当前元素与前一个不重复元素不同),则将nums[fast]移到slow位置,然后slow += 1。 - 否则,
fast继续前进。
- 如果
- 返回
slow,即不重复元素的个数。
代码实现(您的代码)
1 | from typing import List |
📊 性能分析
- 时间复杂度:,一次遍历。
- 空间复杂度:,原地修改。
思考
您的代码使用交换(nums[slow], nums[fast] = nums[fast], nums[slow])来将不重复元素挪到前面,但更常见的是直接覆盖(nums[slow] = nums[fast]),因为 slow 位置的值不再需要。交换也能工作,但略显冗余。
关键点:slow 始终指向下一个要写入的位置,而 slow-1 是最后一个已确认的不重复元素。当遇到新元素时,将其放入 slow 并递增 slow。最终返回 slow 即为长度。
此解法是去重问题的标准双指针实现,简洁高效。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






