题目描述
给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。
示例 1:
输入: [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数;
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
注意: 输入数组的长度不会超过 10000。
解题
我们的目的是找到每个数字右边第一个比它大的数字。思路就是用一个栈来存储循环时比当前栈顶数字小的数字的位置,当找到右边第一个比它大的数字时,将栈顶的数值弹出。
例如,当前栈的情况如下:
若这时nums[i]>1,就将栈顶弹出,说明它已经找到右边第一个比它大的数字了。
因为题目设置这是一个循环数组,也就是最后的数字连接到第一个数字成环。所以我们在nums后面加上重复的nums,实现循环数组的效果。
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
int len=nums.size();
if(len==0)return nums;
vector<int>res(len,-1);
int i=0;
stack<int>s;
for(int i=len;i<2*len;i++)
{
nums.push_back(nums[i%len]);
}
while(i<nums.size()){
if (s.empty()||nums[s.top()]>=nums[i]){
s.push(i++);
}
else{
while(!s.empty()&&nums[s.top()]<nums[i]){
res[s.top()%len]=nums[i];
s.pop();
}
}
}
return res;
}
};