简单系列的第二十一题对于Python有序链接暂时没有弄明白是怎么操作的,只是看了别人大神的代码过了,所以暂时不写。
现在由二十六题开始继续做题。
题目:
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1,2 你不需要考虑数组中超出新长度后面的元素。
尝试代码第一遍
class Solution:
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
for i in nums:
n=nums.count(i)#4
n2 = nums.index(i)
count=0
while count<n-1:
nums.pop(n2+1)
count=count+1
return len(nums)
以上代码到LeetCode的最后一个测试题的时候挂掉了,timeout,多么让人熟悉的字眼。这说明我的代码还不够优化,可应该没有符合O(1)这个标准。所以需要再次改进这段代码。
尝试代码第二遍
class Solution:
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n=len(set(nums))
while n!=len(nums):
for i in nums:
ns=nums.count(i)
if ns>1:
nums.remove(i)
return len(nums)
又出现了timeout,W( ̄_ ̄)W
ε=(´ο`*)))唉,继续想,是因为既有while循环又有for遍历么,所以程序运行占的内存和时间的耗时都多么……
思考了一天,感觉还是需要用遍历和循环,于是在网上搜索了一下其他大神的答案,然后给出了一个思路的是【26-30】LeetCode:Python解题这位大神的代码。
看到这个解题的时候,才发现自己的想法就错了,因为题目中有原地删除,所以首先想到的是列表中的remove和pop,在这两个方法都尝试了一遍之后,我选择的是用pop来做题。所以一直困在了遍历、循环、计数这个思路中无法自拔。
但是看到了上面大神的代码之后,在回去看了一遍题目,发现里面的示例中还写“你不需要考虑数组中超出新长度后面的元素”, 所以后面实际上是可以有多余的数字的。然后原地删除,除了删除,其实还可以赋值。这个是一个需要学习的思路!!!
现在摆上我理解和借鉴之后的代码,嘛,这个是通过的哦~
成功代码:
class Solution:
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n=len(nums)
s=0
s1=len(set(nums))
for i in range(1,n):
if nums[i]!=nums[s]:
s+=1
nums[s]=nums[i]
return len(nums[:s1])
最后惯例,摆个图,嘿嘿~