Description

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

Example:

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

Intuition#

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

  • 如果從左往右,每個位置都需要掃描右邊所有元素找最大值,O(n^2)
  • 從右往左只需維護一個 running max,O(n) 即可完成

Approaches#

1: Brute Force#

  • 概念: 對每個位置,掃描其右側所有元素找最大值
  • 時間複雜度: O(n^2) - 每個位置掃描右側
  • 空間複雜度: 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(從右往左)#

  • 概念: 從最後一個元素開始,維護右側最大值 rightMax,邊遍歷邊更新
  • 時間複雜度: O(n) - 一次遍歷
  • 空間複雜度: 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#

  • Pattern: 逆序遍歷 + 維護累積值,是處理「右側資訊」的常見技巧
  • 關鍵技巧: 遇到需要查詢「右側最大/最小」的題目,先想到從右往左掃描