题目
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。
示例 2:
给定 nums = [0,0,1,1,1,2,2,3,3,4],
函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
你不需要考虑数组中超出新长度后面的元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
解答
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
if not nums:
return 0
i = 1
while i < len(nums):
if nums[i] == nums[i-1]:
del nums[i]
i -= 1
i += 1
return len(nums)
148 ms
15.3 MB
注意!while i < len(nums):
不能换成for i in range(1,len(nums))
这里的for循环和其他语言不同,不是在一遍循环结束的时候进行i+=1
,而是i循环range里的数,所以即使循环内部有i-=1
也不会对下一次循环i 的值产生改变。
如果要用for循环,就使用双指针法。
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
flag = 0 # 定义一个指针变量
for num in nums: # 遍历数组
if nums[flag] != num: # 若指针指向的元素与当前遍历数组的元素不同
flag += 1 # 指针后移一位
nums[flag] = num # 修改数组,将不同的元素占用重复元素的位置
# 若相同则指针不动,数组继续往后遍历
# 注意考虑数组为空的情况(flag初始值为0,由于要求数组长度,故需要加1)
return flag + 1
120 ms
15.4 MB