503. 下一个更大元素 II
思路:维护一个单调递减的栈。从右往左遍历,当左边的数比已遍历过的右边的数大,那么右边的数在后续一定用不到了。
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
int n=nums.size();
//单调递减栈
stack<int> st;
//先从右到左处理一遍数组
for(int i=n-1;i>=0;i--){
//如果当前栈不为空,且栈顶元素小于nums[i]
while(st.size()&&st.top()<nums[i]) st.pop();
st.push(nums[i]);
}
//保存输出的答案
vector<int> v;
for(int i=n-1;i>=0;i--){
//如果当前栈不为空,且栈顶元素小于nums[i]
while(st.size()&&st.top()<=nums[i]) st.pop();
//如果栈为空,说明不存在
if(st.size()==0) v.push_back(-1);
else v.push_back(st.top());
//把当前的数压入栈
st.push(nums[i]);
}
//转置一下数组即可
reverse(v.begin(),v.end());
return v;
}
};