木槿花篱

嘻嘻,欢迎~

503. 下一个更大元素 II (暴力、单调栈)

题目:

给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。

示例 1:

输入: [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数;
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
注意: 输入数组的长度不会超过 10000。

 

方法一:遍历每一个数,在这个数的后面找到比它大的数,如果到达数组边界,则重头开始寻找,没有的话返回-1;

 1 class Solution {
 2 public:
 3     vector<int> nextGreaterElements(vector<int>& nums) {
 4         int max = 0;
 5         vector<int> max_(nums.size());
 6         for(int i = 0; i < nums.size(); i++){
 7             max_[i] = nextMax(nums,i);
 8         }
 9         return max_;
10 
11     }
12 
13     int nextMax(vector<int>& nums,int now){
14         for(int i = now+1; i < nums.size();i++)
15             if(nums[i] > nums[now]) return nums[i];
16         for(int i = 0; i < now; i++)
17             if(nums[i] > nums[now])return nums[i];
18 
19         return -1;
20     }
21 };

方法二:单调栈

建立一个记录 还没有找到后续更大数 的栈 s

1. 每当遍历到一个新数时,用它来和之前栈顶数比较,如果比栈顶数小(>=) ,意味着比栈中的所有数都小(>=),则新数入栈;

  如果比栈顶数大,即找到栈顶数的后续第一个更大数,栈顶弹出,新数再与新栈顶比较。

遍历了一遍之后,更大数的位序>原数的位序 的情况没了,现在就剩下,更大数的位序<原数 和 不存在更大数了;

2. 再重头遍历一遍,但是这个时候已经没有新数了,所以不存在新数入栈。

    如果比栈顶数大,即找到栈顶数的后续第一个更大数,栈顶弹出,新数再与新栈顶比较。

    遍历了一遍之后,现在就剩下,不存在更大数了;

3. 把栈中剩下的数的最大数都设为-1;

另外,为方便记录,栈中仅存放数的位序。

 1 class Solution {
 2 public:
 3     vector<int> nextGreaterElements(vector<int>& nums) {
 4         
 5         vector<int> max_(nums.size());
 6         if(nums.size()==0) return max_;
 7         stack< int > s;
 8         
 9         for(int i = 0; i < nums.size(); i++){
10             while(!s.empty() && nums[i] > nums[s.top()]) {
11                 max_[s.top()] = nums[i];
12                 s.pop();             
13             }
14             s.push(i);
15         }
16         for(int i = 0; i < nums.size(); i++){
17             while(!s.empty() && nums[i] > nums[s.top()]) {
18                 max_[s.top()] = nums[i];
19                 s.pop();             
20             }
21         }
22         while(!s.empty()){
23             max_[s.top()] = -1;
24             s.pop();
25         }
26         return max_;
27     }
28 };

 

posted @ 2020-10-29 16:47  木槿花篱  阅读(52)  评论(0编辑  收藏  举报