Easy草稿★★★★★O(n + m) 時間 · O(m) 空間
StackHash TableArray
Patterns🥞 堆疊#️⃣ 雜湊
尚未複習過

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

496Next Greater Element IArrays & HashingEasyArrays & Hashing

給定兩個無重複元素的陣列 nums1nums2,其中 nums1nums2 的子集。對 nums1 中的每個元素,在 nums2 中找到它右邊第一個比它大的元素。不存在則回傳 -1。

Example:

Input: nums1 = [4,1,2], nums2 = [1,3,4,2] Output: [-1,3,-1]

Intuition

TIP

核心思路:用單調遞減 Stack 預處理 nums2 中每個元素的下一個更大值,存入 HashMap,再查詢 nums1

Approaches

1. Brute Force — O(n * m) / O(1)
  • Idea: 對 nums1 每個元素,在 nums2 中找到其位置,然後往右掃描找更大的
  • Time: O(n * m) - n 為 nums1 長度,m 為 nums2 長度
  • Space: O(1) - 不計輸出
class Solution {
    fun nextGreaterElement(nums1: IntArray, nums2: IntArray): IntArray {
        val result = IntArray(nums1.size)
        for (i in nums1.indices) {
            var found = false
            var greater = -1
            for (j in nums2.indices) {
                if (nums2[j] == nums1[i]) found = true
                if (found && nums2[j] > nums1[i]) {
                    greater = nums2[j]
                    break
                }
            }
            result[i] = greater
        }
        return result
    }
}
⭐ 2. Monotonic Stack + HashMap — O(n + m) / O(m)
  • Idea: 遍歷 nums2,維護單調遞減 Stack。當前元素比棧頂大時,棧頂的 Next Greater 就是當前元素。將結果存入 Map,最後查詢 nums1
  • Time: O(n + m) - 每個元素最多進出 Stack 一次
  • Space: O(m) - Stack 和 HashMap
class Solution {
    fun nextGreaterElement(nums1: IntArray, nums2: IntArray): IntArray {
        val map = HashMap<Int, Int>()
        val stack = ArrayDeque<Int>()

        for (num in nums2) {
            while (stack.isNotEmpty() && stack.peek() < num) {
                map[stack.pop()] = num
            }
            stack.push(num)
        }

        return IntArray(nums1.size) { map.getOrDefault(nums1[it], -1) }
    }
}

🔑 Takeaways

Ladders 看全部 →

📚

單調堆疊

「下一個更大」的模板與延伸。

  1. 1#739Daily TemperaturesMedium每日溫度:下一個更大元素的距離
  2. 2
  3. 3
  4. 4#84Largest Rectangle in HistogramHard柱狀圖最大矩形:單調堆疊經典應用