给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
思路:
- 处理边界情形,长度小于等于1,直接返回1即可
- 使用
index
变量标记新得到数组的元素索引,依次在这个位置上放上正确的值,然后+1
处理下一个 - 从下标为
i=1
开始遍历数组,只有当元素不等于前一个元素时,就说明i-1
为重复元素的末尾,要将上面的元素放到index
上面了 - 关键是数组最后一个元素怎么处理。最后一个元素一定会放到
index
上,为了代码的简洁性,我将原来的数组末尾人为添加一个与原数组最后一个元素不同的元素。
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
if len(nums)<=1:
return 1
nums.append(nums[-1]+1)
index = -1
for i in range(1, len(nums)):
if nums[i]!=nums[i-1]:
index += 1
nums[index] = nums[i-1]
return index+1
写代码中注意几点:
- 边界情形,数组为空,元素个数为1,首先处理掉,这样后续的代码就可以把最小的例子放在心中去比照着去写代码,边写边验证,不要等到最后才调试
- 辅助变量的使用,这里是新数组的
index
,这是与题目要求一致的变量,这个变量有了问题的输出也就有了,也就是这个变量最好与输出变量一起考虑 - 循环的使用,考虑清楚遍历的起始和终止,是顺序还是逆序
- 判断的使用,只取具有实际操作的判断,问题中只有连续两个元素不等时才有变化,相等时遍历即可,所以使用不等作为判断条件,这个要与最终输出一起考虑,要逐渐向输出靠拢