LeetCode 热题 100 283. 移动零

news/2025/2/22 5:57:08

LeetCode 热题 100 | 283. 移动零

大家好,今天我们来解决一道经典的算法题——移动零。这道题在LeetCode上被标记为简单难度,要求我们将数组中的所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。下面我将详细讲解解题思路,并附上Python代码实现。


问题描述

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。要求原地操作,不能复制数组。

示例:

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

解题思路

核心思想
  1. 双指针法

    • 使用两个指针 leftright,其中 left 指向当前已经处理好的非零元素的末尾,right 用于遍历数组。
    • nums[right] 不为 0 时,将其与 nums[left] 交换,并将 left 右移。
  2. 原地操作

    • 通过交换元素的方式,避免使用额外的空间。

Python代码实现

def moveZeroes(nums):
    left = 0  # 指向当前已经处理好的非零元素的末尾
    for right in range(len(nums)):
        # 如果当前元素不为0,则将其移动到left位置
        if nums[right] != 0:
            nums[left], nums[right] = nums[right], nums[left]
            left += 1

# 测试示例
nums1 = [0, 1, 0, 3, 12]
nums2 = [0]

moveZeroes(nums1)
moveZeroes(nums2)

print(nums1)  # 输出: [1, 3, 12, 0, 0]
print(nums2)  # 输出: [0]

代码解析

  1. 初始化指针

    • left 指针初始化为 0,表示当前已经处理好的非零元素的末尾。
  2. 遍历数组

    • 使用 right 指针遍历数组,当 nums[right] 不为 0 时,将其与 nums[left] 交换,并将 left 右移。
  3. 交换元素

    • 通过交换操作,将非零元素移动到数组的前面,同时保持相对顺序。
  4. 原地操作

    • 直接在原数组上进行操作,不需要额外的空间。

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组的长度。我们只需要遍历数组一次。
  • 空间复杂度:O(1),只使用了常数个额外空间。

示例运行

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

进阶:减少操作次数

在基本解法中,我们每次遇到非零元素都会进行一次交换操作。如果数组中没有 0,这种交换是不必要的。可以通过判断 leftright 是否相等来减少交换次数。

优化代码
def moveZeroes_optimized(nums):
    left = 0  # 指向当前已经处理好的非零元素的末尾
    for right in range(len(nums)):
        # 如果当前元素不为0,则将其移动到left位置
        if nums[right] != 0:
            if left != right:  # 避免不必要的交换
                nums[left], nums[right] = nums[right], nums[left]
            left += 1

# 测试示例
nums1 = [0, 1, 0, 3, 12]
nums2 = [0]

moveZeroes_optimized(nums1)
moveZeroes_optimized(nums2)

print(nums1)  # 输出: [1, 3, 12, 0, 0]
print(nums2)  # 输出: [0]

优化代码解析

  1. 减少交换次数

    • 只有当 leftright 不相等时,才进行交换操作。
    • 这样可以避免在数组中没有 0 时进行不必要的交换。
  2. 时间复杂度

    • 仍然是 O(n),但实际运行效率更高。

总结

通过使用双指针法,我们可以高效地将数组中的 0 移动到末尾,同时保持非零元素的相对顺序。优化后的代码进一步减少了不必要的交换操作,提高了运行效率。希望这篇题解对大家有所帮助,如果有任何问题,欢迎在评论区留言讨论!

关注我,获取更多算法题解和编程技巧!


http://www.niftyadmin.cn/n/5861708.html

相关文章

RabbitMQ 消息队列 优化发送邮件

express 发送邮件 最简单的异步发送邮件方法为何要使用 RabbitMQ?如何在 Node 项目中集成 RabbitMQ? 一、 不用 await 发送邮件 在实际开发之前,不妨先思考下,我们最终的目的是为了让邮件异步发送。那发送邮件这里有个await&am…

【量化科普】Volatility,波动率

【量化科普】Volatility,波动率 🚀量化软件开通 🚀量化实战教程 在量化投资领域,波动率(Volatility)是衡量资产价格变动幅度的一个重要指标。它反映了资产价格的稳定程度,通常以标准差的形式…

2025最新高维多目标优化:基于城市场景下无人机三维路径规划的导航变量的多目标粒子群优化算法(NMOPSO),MATLAB代码

一、基于导航变量的多目标粒子群优化算法(NMOPSO)介绍 基于导航变量的多目标粒子群优化算法(Navigation variable-based multi-objective particle swarm optimization,NMOPSO)是2025年提出的一种用于无人机路径规划的…

QSplashScreen --软件启动前的交互

目录 QSplashScreen 类介绍 使用方式 项目中使用 THPrinterSplashScreen头文件 THPrinterSplashScreen实现代码 使用代码 使用效果 QSplashScreen 类介绍 QSplashScreen 是 Qt 中的一个类,用于显示启动画面。它通常在应用程序启动时显示,以向用户显…

wps中zotero插件消失,解决每次都需要重新开问题

参考 查看zotero目录 D:\zotero\integration\word-for-windows 加载项点击 dotm即可 长期解决 把dom 复制到 C:\Users\89735\AppData\Roaming\kingsoft\office6\templates\wps\zh_CN还是每次都需要重新开的话 重新加载一下

【后端】gitHub访问速度太慢解决办法

问题描述 浏览器无法打开GitHub,加载非常慢 解决方法 1、修改本地hosts文件,增加到 http://github.global.ssl.fastly.net 和 http://github.com 的映射 本机hosts 文件位置: C:\Windows\System32\drivers\etc配置如下: # g…

AIGC视频扩散模型新星:SVD——稳定扩散的Video模型

大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍慕尼黑大学携手 NVIDIA 等共同推出视频生成模型 Video LDMs。NVIDIA 在 AI 领域的卓越成就家喻户晓,而慕尼黑大学同样不容小觑,…

MySQL:安装和MySQL基础

一、centos7下安装MySQL 说明:安装与卸载的过程中,用户全部切换成root,等初期完全适应mysql语句的时候,再尝试创建普通用户!! 1.1 卸载不必要的软件 关于mysql和mariadb:MySQL和MariaDB,它们有…