26.从排序数组中删除重复项-Python-LeetCode

版权声明:转载请注明! 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。
你不需要考虑数组中超出新长度后面的元素。

二、解法

我们先把列表排序,然后设置两个变量,startend ,一个用来计数,一个用来遍历列表,如果 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笔记

公众号二维码.jpg

猜你喜欢

转载自blog.csdn.net/linfeng886/article/details/82226811
今日推荐