【算法合集-leetcode系列】5.移动零(No.283)

题目如下:

283. 移动零icon-default.png?t=M666https://leetcode.cn/problems/move-zeroes/

思路:

其实最直观的想法,不要跟着题目走,而是挑选出非0部分,按顺序排好数组。然后统计非0部分,补在后面。

官方解题提供了一种【交换】的思路,双指针,加快运行效率。我们不需要管0,只需要管非0

#解1:循环+切片
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        new=[]
        for num in nums:
            if num!=0:
                new.append(num)
        #print(new)
        nums[:]=new+(len(nums)-len(new))*[0]
#解法2 双指针补0
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        i,j=0,0
        while j<len(nums):
            if nums[j]!=0:
                nums[i]=nums[j]
                i+=1
            j+=1
            #print(i,j,nums)
        nums[:]=nums[:i]+(len(nums)-i)*[0]

        
   

上述两种速度都很快。第二种方法空间占用更低一些。

官方的【交换】:

#解法3
class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        i,j=0,0
        while j<len(nums):
            if nums[j]!=0:
                nums[i],nums[j]=nums[j],nums[i]
                i+=1
            j+=1
            

 速度会慢一些

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值