IT评测·应用市场-qidao123.com技术社区

标题: LeetCode 热题 100 283. 移动零 [打印本页]

作者: 嚴華    时间: 2025-2-23 17:26
标题: LeetCode 热题 100 283. 移动零
LeetCode 热题 100 | 283. 移动零

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

问题形貌

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。要求原地操纵,不能复制数组。
示例:
  1. 输入: nums = [0,1,0,3,12]
  2. 输出: [1,3,12,0,0]
复制代码

解题思绪

核心思想


Python代码实现

  1. def moveZeroes(nums):
  2.     left = 0  # 指向当前已经处理好的非零元素的末尾
  3.     for right in range(len(nums)):
  4.         # 如果当前元素不为0,则将其移动到left位置
  5.         if nums[right] != 0:
  6.             nums[left], nums[right] = nums[right], nums[left]
  7.             left += 1
  8. # 测试示例
  9. nums1 = [0, 1, 0, 3, 12]
  10. nums2 = [0]
  11. moveZeroes(nums1)
  12. moveZeroes(nums2)
  13. print(nums1)  # 输出: [1, 3, 12, 0, 0]
  14. print(nums2)  # 输出: [0]
复制代码

代码分析


复杂度分析



示例运行

示例1

  1. 输入: nums = [0, 1, 0, 3, 12]
  2. 输出: [1, 3, 12, 0, 0]
复制代码
示例2

  1. 输入: nums = [0]
  2. 输出: [0]
复制代码

进阶:镌汰操纵次数

在根本解法中,我们每次遇到非零元素都会举行一次交换操纵。如果数组中没有 0,这种交换是不须要的。可以通过判定 left 和 right 是否相等来镌汰交换次数。
优化代码

  1. def moveZeroes_optimized(nums):
  2.     left = 0  # 指向当前已经处理好的非零元素的末尾
  3.     for right in range(len(nums)):
  4.         # 如果当前元素不为0,则将其移动到left位置
  5.         if nums[right] != 0:
  6.             if left != right:  # 避免不必要的交换
  7.                 nums[left], nums[right] = nums[right], nums[left]
  8.             left += 1
  9. # 测试示例
  10. nums1 = [0, 1, 0, 3, 12]
  11. nums2 = [0]
  12. moveZeroes_optimized(nums1)
  13. moveZeroes_optimized(nums2)
  14. print(nums1)  # 输出: [1, 3, 12, 0, 0]
  15. print(nums2)  # 输出: [0]
复制代码

优化代码分析


总结

通过利用双指针法,我们可以高效地将数组中的 0 移动到末尾,同时保持非零元素的相对顺序。优化后的代码进一步镌汰了不须要的交换操纵,进步了运行效率。盼望这篇题解对各人有所帮助,如果有任何问题,接待在批评区留言讨论!
关注我,获取更多算法题解和编程本领!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4