503. Next Greater Element II

Given a circular array (the next element of the last element is the first element of the array), print the Next Greater Number for every element. The Next Greater Number of a number x is the first greater number to its traversing-order next in the array, which means you could search circularly to find its next greater number. If it doesn't exist, output -1 for this number.

Example 1:

Input: [1,2,1]
Output: [2,-1,2]
Explanation: The first 1's next greater number is 2; 
The number 2 can't find next greater number;
The second 1's next greater number needs to search circularly, which is also 2.

Note: The length of given array won't exceed 10000.

解题思路:用栈来保存之前的最大值。当新元素x大于s.top(),则说明s.top()的下一个比他大的元素为x,否则把x入栈。由于这是个循环数组,所以第一轮之后剩下的元素肯定是单调递减的,从头开始继续找比栈顶元素的下一个比他大的数。也就是需要遍历两遍数组

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

 

posted @ 2017-03-18 16:37  Tsunami_lj  阅读(172)  评论(0编辑  收藏  举报