题目:给定一个循环数组,求数组中每一个元素的下一个更大的元素。若元素为数组中最大的,则输出-1。
例:给定数组[1,2,1],则结果为[2,-1,2]。
思路:采用单调栈来解决,时间复杂度为O(n)。单调栈存储的是数组中元素的下标。单调栈的更新如下:栈为空,则直接将元素下标压入栈内;若要入栈的元素不大于栈顶元素,则元素直接入栈;若要入栈的元素大于栈顶元素,则把栈顶元素出栈,并且其下一个更大的元素就是要入栈的元素。
以样例为例:设返回结果为ans,给定数组为nums
单调栈更新过程:
1. push 0 (栈为空)
2.ans[stack.top()] = 2 ;pop (栈内元素nums[0] < 2); push 1
3.push 2(要入栈的元素1不大于栈内元素)
4.push 0(循环数组,游标回到数组首位;要入栈的元素不大于栈顶元素)
5.ans[stack.top()] = 2; pop; ans[stack.top()] = 2; pop; push 1(要入栈的元素大于栈顶元素,出栈后下一个栈顶元素还是小于2,所以两次出栈操作)
6.push 2
7.完成对数组的两次遍历,遍历结束。返回结果ans。
代码:
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
vector<int> ans;
int len = nums.size();
if(len == 0) return ans;
ans.resize(len, -1);
stack<int> st;
st.push(0);
for(int i=1;i<2*len;i++)
{
while(!st.empty() && nums[st.top()] < nums[i % len])
{
ans[st.top()] = nums[i % len];
st.pop();
}
st.push(i % len);
}
return ans;
}
};