【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
相关推荐
Yuzhiyuxia8 小时前
【AI Agent面试系列】AI Agent记忆机制知识点1
人工智能·面试·职场和发展
UIU1148 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场9 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi9 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
秋天的怀念_David10 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
碧海银沙音频科技研究院10 小时前
在PC电脑上用Whisper→Marian算法实现离线语音翻译功能
算法·whisper
niyongsheng11 小时前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
j7~13 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
傅科摆 _ py14 小时前
DP,贪心,堆和栈,二分力扣复习
开发语言·python·算法
Shaoshing15 小时前
LeetCode100 42.接雨水
java·算法·leetcode