移动零

🔗 移动零

题目来源:283. 移动零 – 力扣(LeetCode)


📌 题目描述

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意,必须在不复制数组的情况下原地对数组进行操作。


✅ 示例解析

示例 1:

  • 输入:nums = [0, 1, 0, 3, 12]
  • 输出:[1, 3, 12, 0, 0]
  • 解释:所有非零元素 1, 3, 12 保持原有顺序,所有 0 被移动到数组末尾。

示例 2:

  • 输入:nums = [0]
  • 输出:[0]
  • 解释:数组中只有一个元素,且为 0,因此无需移动。

示例 3:

  • 输入:nums = [1, 0, 2, 0, 3]
  • 输出:[1, 2, 3, 0, 0]
  • 解释:非零元素 1, 2, 3 按原顺序排列,两个 0 被移到末尾。

⚠️ 提示

  • 1 <= nums.length <= 10⁴
  • -2³¹ <= nums[i] <= 2³¹ - 1

要求:在原数组上操作,不能复制数组。


💡 解法:双指针法(快慢指针)—— O(n) 时间,O(1) 空间

class Solution {
    public void moveZeroes(int[] nums) {
        int index = 0; 
        for (int i = 0; i < nums.length; i++) { 
            if (nums[i] != 0) {
                int temp = nums[i];
                nums[i] = nums[index];
                nums[index] = temp;
                index++;
            }
        }
    }
}

📊 复杂度分析

  • 时间复杂度:O(n)
    只需一次遍历数组,每个元素最多被访问一次,交换操作为常数时间。
  • 空间复杂度:O(1)
    只使用了常数额外空间(indextemp 变量),满足原地操作要求。

🧩 解题思路

  1. 双指针思想
    • 定义一个慢指针 index,表示下一个非零元素应放置的位置。
    • 使用快指针 i 遍历整个数组。
  2. 核心逻辑
    • 当遇到非零元素时,将其与 index 位置的元素交换(或将值赋给 index 位置),然后 index++
    • 这样可以保证所有非零元素按顺序被“挤”到数组前端。
  3. 为什么能保持相对顺序? 因为快指针从左到右遍历,非零元素按出现顺序依次被放置在 index 位置,因此它们的相对顺序不变。
  4. 0 自然后移: 所有非零元素被前移后,剩下的位置自然由 0 填充,无需额外操作。
文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇