• 打败算法 —— 移动零


    本文参考

    出自LeetCode上的题库 —— 移动零

    https://leetcode-cn.com/problems/move-zeroes/

    移动零问题

    给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。注意 ,必须在不复制数组的情况下原地对数组进行操作

    示例1:
    输入: nums = [0,1,0,3,12]
    输出: [1,3,12,0,0]

    示例2:
    输入:nums = [0]
    输出:[0]

    解题思路

    第一种解法,先遍历一遍原列表,记录0的个数的同时将0从列表中删除,然后再在末尾添加对应个数的0

    第二种解法利用双指针,我们定义指针i和指针j:
    1)当字符串前部都为非0值时,使两个指针同时向前移动
    2)遇到0值后,指针j停留在原处
    3)指针i继续向右移动,直到找到一个非0值,此时交换两个指针所指的值
    4)交换完成后,指针i和指针j继续向右移动,指针j向右移动一位后一定再次停留在0值的位置上
    5)重复3)和4),直到指针i完成列表的遍历

    两种解法都占用$O(n)$的时间复杂度,但第二种解法更快,并且仅需$O(1)$的空间复杂度

    O(n)空间复杂度解法

    class Solution:
      # 移除0后再添加 

      def move_zeroes_1(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        i = 0
        cnt = 0
        while i != len(nums):
          if nums[i] == 0:
            cnt += 1
            nums.pop(i)
          else:
            i += 1
        for j in range(cnt):
          nums.append(0)

    O(1)空间复杂度解法(双指针)

    def move_zeroes_4(self, nums: List[int]) -> None:
      if not nums:
        return
      # 开始时,若没有遇到 0,则指针 i 和指针 j 一起移动 

      # 碰到 0 后,指针 j 始终会指向
    0
      j = 0
      for i in range(len(nums)):
        #
    当前元素 !=0 时进行交换
        if nums[i]:
          if i != j:
            nums[j], nums[i] = nums[i], nums[j]
          j += 1

  • 相关阅读:
    面向机器学习的特征工程
    卷积可视化,图像理解,deepdream,风格迁移
    损失函数
    开源是如何支撑区块链技术发展的
    揭秘机密计算:弥补最后一个入侵 “漏洞”
    什么是超大规模数据中心?
    比特币是避险资产还是储备资产?
    区块链技术生态持续优化,五大趋势不容忽视
    物联网低功耗广域网(LPWAN)的比较
    碎片化是物联网快速发展的阻碍,也是机会
  • 原文地址:https://www.cnblogs.com/kuluo/p/15959468.html
Copyright © 2020-2023  润新知