版权声明:转载请注明! https://blog.csdn.net/linfeng886/article/details/82226811
一、题目
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 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。
你不需要考虑数组中超出新长度后面的元素。
二、解法
我们先把列表排序,然后设置两个变量,start
和 end
,一个用来计数,一个用来遍历列表,如果 nums[start]
和 nums[end]
相等,那么 end
往后移一位,如果两者不相等,那么 nums[end]
赋值给 nums[start+1]
, 然后两者往后移一位
代码如下:
#排除空列表跟只有一个元素的列表
l = len(nums)
if l < 2:
return l
#先进行排序,然后设置两个变量
nums.sort()
start, end = 0, 1
#start用来记录个数,end用来遍历列表,与start进行比较
while end < l:
#当两者相等的时候,end往后移一位
if nums[start] == nums[end]:
end += 1
else:
#当两者不相等的时候,nums[start]后一位的值设置为nums[end]
nums[start+1] = nums[end]
#两个变量都往后移一位
start += 1
end += 1
return start+1
时间:92ms,击败了 73%
因为不管两者是否相等还是不相等,每次end始终要往后移动一位,所以我们可以把代码优化下
优化后的代码:
#优化后代码
l = len(nums)
if l < 2:
return l
nums.sort()
start = 0
for x in range(1,l):
if nums[start] != nums[x]:
nums[start+1] = nums[x]
start += 1
return start+1
时间:76ms, 击败了 97%
结语
欢迎关注我的公众号
疯子的Python笔记