LeetCode题库第二十六题(简单系列)

简单系列的第二十一题对于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

以上代码到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

LeetCode题库第二十六题(简单系列)_第1张图片

ε=(´ο`*)))唉,继续想,是因为既有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])

 最后惯例,摆个图,嘿嘿~

 

 

 

你可能感兴趣的:(Leetcode题库练习,LeetCode简单系列)