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

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

80Remove Duplicates From Sorted Array IITwo PointersMediumTwo Pointers

給定已排序的整數陣列 nums,原地移除重複元素,使每個元素最多出現兩次。回傳結果長度 k

Example:

Input: nums = [1,1,1,2,2,3] Output: 5, nums = [1,1,2,2,3,_]

Intuition

TIP

核心思路:慢指針追蹤寫入位置,只要當前元素不等於 nums[slow - 2](即允許最多兩個重複),就寫入。

Approaches

1. Counting — O(n) / O(1)
  • Idea: 用計數器追蹤當前元素出現次數,超過 2 次就跳過
  • Time: O(n)
  • Space: O(1)
class Solution {
    fun removeDuplicates(nums: IntArray): Int {
        if (nums.size <= 2) return nums.size
        var slow = 1
        var count = 1
        for (fast in 1 until nums.size) {
            if (nums[fast] == nums[fast - 1]) {
                count++
            } else {
                count = 1
            }
            if (count <= 2) {
                nums[slow] = nums[fast]
                slow++
            }
        }
        return slow
    }
}
⭐ 2. Two Pointers (general template) — O(n) / O(1)
  • Idea: slow 指向下一個寫入位置;若 nums[fast] != nums[slow - 2],表示可以再加一個,寫入後推進 slow
  • Time: O(n) - 一次遍歷
  • Space: O(1) - 原地操作
class Solution {
    fun removeDuplicates(nums: IntArray): Int {
        if (nums.size <= 2) return nums.size
        var slow = 2
        for (fast in 2 until nums.size) {
            if (nums[fast] != nums[slow - 2]) {
                nums[slow] = nums[fast]
                slow++
            }
        }
        return slow
    }
}

WARNING

通用模板:若允許最多出現 k 次,條件改為 nums[fast] != nums[slow - k],初始 slow = k

🔑 Takeaways