Easy草稿★★★★★O(n) 時間 · O(1) 空間
Two PointersArray
Patterns↔️ 雙指針
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

283Move ZeroesTwo PointersEasyTwo Pointers

給定整數陣列 nums,將所有 0 移到陣列末尾,同時保持非零元素的相對順序。必須原地操作。

Example:

Input: nums = [0,1,0,3,12] Output: [1,3,12,0,0]

Intuition

TIP

核心思路:用一個慢指針記錄下一個非零元素該放的位置,快指針掃描所有元素。

Approaches

1. Extra Array — O(n) / O(n)
  • Idea: 建立新陣列,先放非零元素,再補 0
  • Time: O(n)
  • Space: O(n)
Extra Array Code
class Solution {
    fun moveZeroes(nums: IntArray): Unit {
        val result = IntArray(nums.size)
        var idx = 0
        for (num in nums) {
            if (num != 0) result[idx++] = num
        }
        for (i in nums.indices) nums[i] = result[i]
    }
}
⭐ 2. Two Pointers (Fast & Slow) — O(n) / O(1)
  • Idea: 慢指針 slow 追蹤下一個非零元素的位置,快指針 fast 掃描整個陣列,遇到非零就交換到 slow 位置
  • Time: O(n) - 一次遍歷
  • Space: O(1) - 原地操作
class Solution {
    fun moveZeroes(nums: IntArray): Unit {
        var slow = 0
        for (fast in nums.indices) {
            if (nums[fast] != 0) {
                val temp = nums[slow]
                nums[slow] = nums[fast]
                nums[fast] = temp
                slow++
            }
        }
    }
}

WARNING

使用交換而非覆蓋(先寫非零再補零),可以在一次遍歷中完成,不需要第二次迴圈填零。

🔑 Takeaways