LeetCode移除有序数组重复项:提交失败原因及Python解法
问题分析与正确解法
原代码错误原因
- 未原地修改数组:你把
nums直接赋值为set(nums),这只是在函数内部重新定义了局部变量nums,完全没改动传入的原数组。题目要求必须直接修改输入的nums数组本身,而不是重新赋值。 - 破坏元素相对顺序:
set是无序结构,会打乱原数组非降序的排列顺序,违反了题目中“保持相对顺序”的要求。 - 未满足输出格式:判题系统会检查修改后的
nums前k个元素是否为去重后的有序元素,你的代码没对原数组做任何修改,自然无法通过校验。
正确Python解法
因为输入数组是非降序排列的,我们可以用双指针法实现原地去重,时间复杂度O(n),空间复杂度O(1):
from typing import List class Solution: def removeDuplicates(self, nums: List[int]) -> int: if not nums: return 0 # 慢指针指向当前唯一元素的最后位置 slow = 0 for fast in range(1, len(nums)): # 当快指针找到新的唯一元素时 if nums[fast] != nums[slow]: slow += 1 # 将新元素赋值到慢指针的下一个位置 nums[slow] = nums[fast] # 唯一元素的个数是慢指针索引+1 return slow + 1
解法说明
- 边界处理:如果数组为空,直接返回0。
- 双指针分工:
slow指针维护去重后数组的末尾位置,fast指针遍历整个数组寻找新的唯一元素。 - 原地修改:当
fast找到与slow指向元素不同的值时,移动slow并将该值覆盖到slow的位置,实现原地更新。 - 返回长度:最终
slow + 1就是去重后唯一元素的个数,此时nums的前slow+1个元素就是保持原顺序的唯一元素。
内容的提问来源于stack exchange,提问作者Yash Kumar Roy
相关产品推荐
相关产品推荐

