Easy草稿★★★★★O(n) 時間 · O(1) 空間
Array
尚未複習過

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

1299Replace Elements With Greatest Element On Right SideArrays & HashingEasyArrays & Hashing

給定陣列 arr,將每個元素替換為其右側所有元素中的最大值,最後一個元素替換為 -1

Example:

Input: arr = [17,18,5,4,6,1] Output: [18,6,6,6,1,-1]

Intuition

TIP

核心思路:從右往左遍歷,維護一個「右側最大值」變數,邊走邊更新。

Approaches

1. Brute Force — O(n^2) / O(1)
  • Idea: 對每個位置,掃描其右側所有元素找最大值
  • Time: O(n^2) - 每個位置掃描右側
  • Space: O(1) - 原地修改
class Solution {
    fun replaceElements(arr: IntArray): IntArray {
        val n = arr.size
        val result = IntArray(n)
        for (i in 0 until n - 1) {
            var max = Int.MIN_VALUE
            for (j in i + 1 until n) {
                max = maxOf(max, arr[j])
            }
            result[i] = max
        }
        result[n - 1] = -1
        return result
    }
}
⭐ 2. Reverse Traversal (right-to-left) — O(n) / O(1)
  • Idea: 從最後一個元素開始,維護右側最大值 rightMax,邊遍歷邊更新
  • Time: O(n) - 一次遍歷
  • Space: O(1) - 原地修改
class Solution {
    fun replaceElements(arr: IntArray): IntArray {
        var rightMax = -1
        for (i in arr.lastIndex downTo 0) {
            val newMax = maxOf(rightMax, arr[i])
            arr[i] = rightMax
            rightMax = newMax
        }
        return arr
    }
}

🔑 Takeaways