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; } };