【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
相关推荐
鹿角片ljp3 小时前
LeetCode 141. 环形链表|从 HashSet 到快慢指针 O (1) 空间最优解
算法·leetcode·链表
薛定e的猫咪3 小时前
(NeurIPS 2022)GraphGPS:MPNN 与全局注意力的融合之道
人工智能·深度学习·学习·算法
AI服务老曹3 小时前
车牌识别算法接入AI视频分析平台的流程和误报优化
人工智能·算法·音视频
神威难绷泪4 小时前
Linux应用软件编程:线程分离属性 互斥机制 同步机制 死锁
linux·开发语言·算法·线程
小星星闪亮登场4 小时前
图论--最小生成树(内含二分图)
数据结构·算法·图论·迭代加深·图搜索算法
ZC跨境爬虫4 小时前
LeetCode 219. 存在重复元素 II(滑动窗口 + 哈希表详解)
算法·leetcode·散列表
吞下星星的少年·-·4 小时前
The 2025 ICPC Asia East Continent Online Contest (I) A题(模拟+贪心)
算法·贪心·模拟
阿宁学科技术库5 小时前
关于“库库AI”在股票投研场景实用性的技术观察
大数据·人工智能·职场和发展
小程序设计5 小时前
【机械设计】磁粉检测机器人的设计与验证
算法·机器人
Navigator_Z5 小时前
LeetCode //C - 1220. Count Vowels Permutation
c语言·算法·leetcode