283. 移动零

type
status
date
slug
summary
tags
category
difficulty
icon
password

283. 移动零

提示
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
示例 2:
提示:
  • 1 <= nums.length <= 104
  • 231 <= nums[i] <= 231 - 1

解题思路

这道题目要求将数组中的所有0移动到末尾,同时保持非零元素的相对顺序不变。解题思路如下:

双指针法

使用两个指针 i 和 j:
  • 指针 i 用于遍历整个数组
  • 指针 j 指向当前应该存放非零元素的位置
具体步骤:
  1. 初始化两个指针 i 和 j,都指向数组开头
  1. 遍历数组,当遇到非零元素时:
      • 将当前元素(nums[i])与 j 指向的位置进行交换
      • j 指针向后移动一位
  1. 继续遍历直到数组结束
这样操作后:
  • 所有非零元素都会按照原有顺序移动到数组前面
  • 所有零元素自动被交换到了数组后面

时间复杂度分析

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

代码解释

代码中的关键部分解释:
  • 当 nums[i] 不为0时,将其与 nums[j] 交换,并将 j 向后移动一位
  • 如果 nums[i] 为0,i 继续向后移动,j 保持不变
  • 这样可以保证 j 之前的所有元素都是非零的,且保持了原有顺序
上一篇
11. 盛最多水的容器
下一篇
128. 最长连续序列

评论
Loading...