1. 程式人生 > 其它 >Leetcode 503 下一個更大元素

Leetcode 503 下一個更大元素

Leetcode 503 下一個更大元素

503. 下一個更大元素 II

難度中等582

給定一個迴圈陣列 numsnums[nums.length - 1] 的下一個元素是 nums[0] ),返回 nums 中每個元素的 下一個更大元素

數字 x下一個更大的元素 是按陣列遍歷順序,這個數字之後的第一個比它更大的數,這意味著你應該迴圈地搜尋它的下一個更大的數。如果不存在,則輸出 -1

示例 1:

輸入: nums = [1,2,1]
輸出: [2,-1,2]
解釋: 第一個 1 的下一個更大的數是 2;
數字 2 找不到下一個更大的數; 
第二個 1 的下一個最大的數需要迴圈搜尋,結果也是 2。

示例 2:

輸入: nums = [1,2,3,4,3]
輸出: [2,3,4,-1,4]

提示:

  • 1 <= nums.length <= 104
  • -109 <= nums[i] <= 109

題解:

這顯然是一道單調佇列題目,關於單調佇列的套路是:只要題目要求尋找一個數的下一個更大的數(更小的數)就可以使用單調棧的技巧,具體的用法可以看[單調棧結構解決三道演算法題 :: labuladong的演算法小抄 (gitee.io)](https://labuladong.gitee.io/algo/2/22/62/)

給出程式碼:

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        vector<int> res=getNextGreater(nums);
        return res;
    }
    vector<int> getNextGreater(vector<int>& nums){
        int n=nums.size();
        vector<int> res(n);
        stack<int> s;
        for(int i=2*n-1;i>=0;i--){
            while(!s.empty()&&nums[i%n]>=s.top()){
                s.pop();
            }
            res[i%n]= s.empty()?-1:s.top();
            s.push(nums[i%n]);
        }
        return res;
    }

};