leetcode【283 Move Zeros】【python】

是让我们将给定数组里的0都放到数组的末尾,然后还要保持非0元素的顺序不变。也不可以复制数组,尽量少操作次数。

最初想的是遇到为0的就pop,然后在尾部append,但是这样如果外面的循环是for的话,那么每次i都增加了,可能你删除第一个之后新成为第一个的原第二个还是0,就没有删除。那么用while的话,一旦后几个全是0的时候就跳不出while了,所以time limited。

重新考虑,这次考虑互换,想找到为0的之后,找到离他最近的不为0的数,然后互换,这样就可以保证互换过来的不是0,并且也保留了原顺序。那么说干就干

class Solution(object):
    def moveZeroes(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        for i in range(len(nums)):
            if(nums[i] == 0):
                index = i+1
                while(index < len(nums) and nums[index] == 0):
                    index += 1
                if(index < len(nums)):
                    nums[i] = nums[index]
                    nums[index] = 0

但是呢,这个复杂度取决于0的多少,貌似是这样的,O(n*k)k是0的个数,所以最差也许有O(n^2)

所以继续!
其实换一种思路就是找到不为0的依次放到0,1,2…的位置就可以了,这样需要维持两个points,前一个其实就是不为0的个数,后面的就是为了遍历。然后再从不为0的后一个开始,全部置为0就行啦

class Solution(object):
    def moveZeroes(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        point = 0
        for i in range(len(nums)):
            if nums[i]:
                nums[point] = nums[i]
                point += 1
        while(point < len(nums)):
            nums[point] = 0
            point += 1

后来又在别人那里看到了更为简洁的,也是这种两个points的想法,但是找到不是0的直接和前面的交换,这样后面的就自动都是0了,不需要再赋值一遍了

class Solution(object):
    def moveZeroes(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        point = 0
        for i in range(len(nums)):
            if nums[i]:
                nums[point] , nums[i] = nums[i], nums[point]
                point += 1

然后我发现还是只能打败40%的人,我就不知道还能怎样啦,不过听说这个跟leetcode那边服务器的状态也是有关的,我就不打算管他啦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值