单调栈经典操作

给你一个数组 [2,1,2,4,3],你返回数组 [4,2,4,-1,-1]。

解释:第一个 2 后面比 2 大的数是 4; 1 后面比 1 大的数是 2;第二个 2 后面比 2 大的数是 4; 4 后面没有比 4 大的数,填 -1;3 后面没有比 3 大的数,填 -1。

1、右边第一个数比它大,从右边开始循环

2、左边第一个数比它大,从左边开始循环

 1 vector<int> nextGreaterElement(vector<int>& nums) {
 2     vector<int> ans(nums.size()); // 存放答案的数组
 3     stack<int> s;
 4     for (int i = nums.size() - 1; i >= 0; i--) { // 倒着往栈里放
 5         while (!s.empty() && s.top() <= nums[i]) { // 判定个子高矮
 6             s.pop(); // 矮个起开,反正也被挡着了。。。
 7         }
 8         ans[i] = s.empty() ? -1 : s.top(); // 这个元素身后的第一个高个
 9         s.push(nums[i]); // 进队,接受之后的身高判定吧!
10     }
11     return ans;
12 }

 

posted @ 2020-04-18 21:30  Jinxiaobo0509  阅读(118)  评论(0)    收藏  举报