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 };