快轉到主要內容
leetcode 503 - Next Greater Element II

leetcode 503 - Next Greater Element II

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

題目
#

leetcode 503 - Next Greater Element II (題目說明請點連結)

題目簡述
#

給定一個循環數組,對於每個元素,找到下一個更大的元素。如果不存在下一個更大的元素,則輸出 -1。

範例
#

Example 1:

Input: nums = [1,2,1]
Output: [2,-1,2]
Explanation: 對於每個元素,找到下一個更大的元素(可以循環查找)。

Example 2:

Input: nums = [1,2,3,4,3]
Output: [2,3,4,-1,4]
Explanation: 對於每個元素,找到下一個更大的元素(可以循環查找)。

解題思路
#

這題要求我們對於數組中的每個元素,找到下一個更大的元素。與 leetcode 496不同的是,這題的數組是循環的,也就是說可以從數組末尾回到開頭繼續查找下一個更大的元素。

解法
#

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

  1. 使用 stack 來維護數組中的索引
  2. 初始化結果數組,所有元素設為 -1
  3. 遍歷數組兩次(模擬循環),對於每個元素,如果 stack 頂元素對應的值小於當前元素,則更新結果
  4. 只在第一次遍歷時將索引加入 stack

例子說明
#

nums = [1,2,1]

  • 初始情況:stack = []res = [-1, -1, -1]
  1. 第一次遍歷:

    • i = 0, num = 1:stack 為空,將索引 0 入 stack
    • i = 1, num = 2:stack 頂元素對應的值 1 < 2,更新 res[0] = 2,將索引 1 入 stack
    • i = 2, num = 1:stack 頂元素對應的值 2 > 1,將索引 2 入 stack
  2. 第二次遍歷:

    • i = 3, num = 1:stack 頂元素對應的值 1 = 1,將索引 0 入 stack
    • i = 4, num = 2:stack 頂元素對應的值 1 < 2,更新 res[2] = 2
    • i = 5, num = 1:stack 頂元素對應的值 2 > 1,將索引 1 入 stack
  3. 最終結果:

    • res = [2, -1, 2]

完整程式碼
#

java
import java.util.*;

class Solution {
    public int[] nextGreaterElements(int[] nums) {
        Stack<Integer> stack = new Stack<>(); // 使用stack來維護數組中的索引
        int n = nums.length, res[] = new int[n]; // 初始化結果數組
        Arrays.fill(res, -1); // 將所有結果設為-1

        // 遍歷數組兩次,模擬循環查找
        for (int i = 0; i < n * 2; i++) {
            int num = nums[i % n]; // 獲取當前元素(模擬循環)
            // 如果stack不為空且stack頂元素對應的值小於當前元素,則更新結果
            while (!stack.isEmpty() && nums[stack.peek()] < num) {
                res[stack.pop()] = num; // 更新stack頂元素的下一個更大元素
            }
            // 只在第一次遍歷時將索引加入stack
            if (i < n) {
                stack.push(i);
            }
        }
        return res;
    }
}

時間複雜度
#

  • 時間複雜度:O(n),其中 n 是數組的長度
  • 空間複雜度:O(n),用於存儲 stack

相關文章

leetcode 394 - Decode String
類別 
Leetcode
標籤 
Java Leetcode Medium Stack Problem
leetcode 735 - Asteroid Collision
類別 
Leetcode
標籤 
Java Leetcode Medium Stack Problem
leetcode 57 - Insert Interval
類別 
Leetcode
標籤 
Java Leetcode Medium Array Problem Blind75