一.解题思路
思路:这题由于我不太确定那种操作不是原地修改的,所以我直接参考了官方的双指针解法。
解释:i表示慢指针、j表示快指针
1.nums[i] == nums[j] 时j+1跳过重复
2.nums[i] != nums[j] 说明遇到不重复的,需要 i+=1,nums[i] = nums[j],j+=1
3.循环1,2操作
4.最后返回不重复的长度就是i+1
注意:nums后面多余的元素不用处理。例如输入:[1,2,3,3,4] 结果[1,2,3,4,4] return 4
二.代码展示
class Solution:
def removeDuplicates(self, nums):
nums_len = len(nums)
if nums_len == 0:
return 0
# i代表冲第一个元素开始,j代表第二个元素开始
i, j = 0, 1
while j < nums_len:
# 判断不重复则覆盖重复的位置
if nums[j] != nums[i]:
i += 1 # i+1就是重复的位置
# 覆盖重复
nums[i] = nums[j]
j += 1
return i+1
三.总结其他
总结:这个题不难,主要是被题目中的这句话唬到了“你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成”。简单解释就是空间复杂度与处理的是数据量无关。官方的双指针解法中就是不停的在nums中操作,没用使用其他变量来中转或其他操作。
交流:如果有什么建议或者疑问可以在文章下面回复哈,期待交流。
本文介绍了如何使用双指针技巧解决删除排序数组中的重复元素问题。通过设置慢指针i和快指针j,当nums[i]==nums[j]时,j++跳过重复;若nums[i]!=nums[j],则更新nums[i]=nums[j],同时i++,j++。最后返回i+1作为新的数组长度。这种方法在原地修改数组且空间复杂度为O(1)。
155

被折叠的 条评论
为什么被折叠?



