【Leetcode】移动零

1 题目

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = 0,1,0,3,12

输出: 1,3,12,0,0

示例 2:

输入: nums = 0

输出: 0

2 分析

要想把0移动到数组末尾,直觉是从左往右看,每遇到一个0,就将它与右边第一个非零元素交换,但这个方式很乱,时间复杂度很高:

  • 首先会导致同一个非零元素被多次交换(如果其左边有很多个0)
  • 需要同时维护当前0的位置,和右边第一个非0的位置,相当于外面一层O(n)遍历,里面还有一层O(n)遍历

要想全程只用一遍遍历,并且保持非零元素的相对顺序,还有一种方法是用一个数组把从左到右遇到的非零元素都记录下来,然后在末尾填补遇到的0,但这不符合题目要求的在原地对数组进行操作。

但从记录非零元素的角度出发,双指针同样可以完成,左指针left记录index,右指针right记录待放入的元素。类似ansi=num的新数组赋值操作,双指针只能通过元素交换来完成,即numleft, numsright=numsright, numsleft。当left=right=0时,如果numright=0,right需要右移直到非零,然后交换;如果numright>0,那么left和right的元素交换(相当于没交换),然后left和right都右移。因此,left的位置要么跟right在一起,要么停在零元素上,所以双指针元素交换能够实现用新数据记录非零元素一样的效果。

3 代码

python 复制代码
def moveZeroes(self, nums):
    """
    :type nums: List[int]
    :rtype: None Do not return anything, modify nums in-place instead.
    """
    n = len(nums)
    l, r = 0,0
    while r < n:
       if nums[r] != 0:
          nums[l], nums[r] = nums[r], nums[l]
          l += 1
       r += 1
相关推荐
人道领域1 小时前
【LeetCode刷题日记】131.分割回文串,动态规划优化
java·开发语言·leetcode
落羽的落羽2 小时前
【项目】JsonRpc框架——开发实现1(细节功能、字段定义、抽象层、具象层)
linux·服务器·网络·c++·人工智能·算法·机器学习
handler012 小时前
【算法】并查集(普通/扩展/带权)模板与例题
数据结构·c++·笔记·算法·c·图论·查并集
嵌入式ZYXC2 小时前
第1篇:《面试题:画一个STM32最小系统电路,每个元件的作用》
stm32·单片机·嵌入式硬件·面试·职场和发展
qq7422349842 小时前
从“感知”到“决断”:测评百度伐谋产业决策智能体的端到端推理与行动机制
人工智能·算法·百度·大模型·运筹优化
huohaiyu3 小时前
深入解析Java垃圾回收机制
java·开发语言·算法·gc
浮芷.3 小时前
鸿蒙PC端 TTS 并发调用问题详解:资源竞争与队列管理
算法·华为·开源·harmonyos·鸿蒙·鸿蒙系统
装不满的克莱因瓶3 小时前
掌握感知器的学习原理
人工智能·python·神经网络·算法·ai·卷积神经网络
Lsk_Smion3 小时前
力扣实训 _ [994].腐烂的橘子/图论
算法·leetcode·图论