快轉到主要內容
leetcode 496 - Next Greater Element I

leetcode 496 - Next Greater Element I

·
類別 
Leetcode
標籤 
Java Leetcode Easy Stack Problem
Eason Chiu
作者
Eason Chiu
一個不做筆記就容易忘記的工程師
目錄

題目
#

leetcode 496 - Next Greater Element I (題目說明請點連結)

題目簡述
#

對於 nums1 中的每個元素,找到 nums2 中該元素右側的第一個比它大的元素。

範例
#

Example 1:

Input: nums1 = [4,1,2], nums2 = [1,3,4,2]
Output: [-1,3,-1]
Explanation: 對於 nums1 中的每個元素,在 nums2 中找到下一個更大的元素。

Example 2:

Input: nums1 = [2,4], nums2 = [1,2,3,4]
Output: [3,-1]
Explanation: 對於 nums1 中的每個元素,在 nums2 中找到下一個更大的元素。

解題思路
#

這題要求我們對於 nums1 中的每個元素,在 nums2 中找到該元素右側第一個比它大的元素。如果沒有找到,則返回 -1。

解法
#

我們可以使用 stack 來解決這個問題。具體步驟如下:

  1. 使用stack來維護 nums2 中的元素
  2. 使用 HashMap 來存儲每個元素的下一個更大元素
  3. 遍歷 nums2,對於每個元素,如果stack頂元素小於當前元素,則更新 HashMap
  4. 最後根據 nums1 中的元素從 HashMap 中獲取結果

例子說明
#

nums1 = [4,1,2], nums2 = [1,3,4,2]

  • 初始情況:stack = []map = {}
  1. 處理元素 1:

    • stack為空,直接將 1 入stack
    • stack = [1]
  2. 處理元素 3:

    • stack頂元素 1 < 3,將 1 出stack並記錄 map[1] = 3
    • stack為空,將 3 入stack
    • stack = [3]map = {1: 3}
  3. 處理元素 4:

    • stack頂元素 3 < 4,將 3 出stack並記錄 map[3] = 4
    • stack為空,將 4 入stack
    • stack = [4]map = {1: 3, 3: 4}
  4. 處理元素 2:

    • stack頂元素 4 > 2,直接將 2 入stack
    • stack = [4, 2]map = {1: 3, 3: 4}
  5. 最終結果:

    • 對於 nums1[0] = 4:map 中沒有 4,返回 -1
    • 對於 nums1[1] = 1:map[1] = 3
    • 對於 nums1[2] = 2:map 中沒有 2,返回 -1
    • 結果:[-1, 3, -1]

完整程式碼
#

java
import java.util.*;

class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        Stack<Integer> stack = new Stack<>(); // 使用stack來維護nums2中的元素
        HashMap<Integer, Integer> map = new HashMap<>(); // 存儲每個元素的下一個更大元素

        // 遍歷nums2,使用單調stack找出每個元素的下一個更大元素
        for (int nums : nums2) {
            // 如果stack不為空且stack頂元素小於當前元素,則更新map
            while (!stack.isEmpty() && stack.peek() < nums) {
                map.put(stack.pop(), nums); // 將stack頂元素出stack並記錄其下一個更大元素
            }
            stack.push(nums); // 將當前元素入stack
        }

        // 根據nums1中的元素從map中獲取結果
        int[] res = new int[nums1.length];
        for (int i = 0; i < res.length; i++) {
            // 如果map中存在該元素的下一個更大元素,則返回該值,否則返回-1
            res[i] = map.containsKey(nums1[i]) ? map.get(nums1[i]) : -1;
        }

        return res;
    }
}

時間複雜度
#

  • 時間複雜度:O(n + m),其中 n 是 nums2 的長度,m 是 nums1 的長度
  • 空間複雜度:O(n),用於存儲 stack 和 HashMap

相關文章

leetcode 503 - Next Greater Element II
類別 
Leetcode
標籤 
Java Leetcode Medium Stack Problem
leetcode 1 - Two Sum
類別 
Leetcode
標籤 
Java Leetcode Easy HashMap Problem Blind75
leetcode 125 - Valid Palindrome
類別 
Leetcode
標籤 
Java Leetcode Easy String Problem Two Pointers Problem Blind75