496.下一个更大元素II
这道题特殊的点在于它有点像环,后面的元素可以再从前面的元素找,我看了卡哥的视频,卡哥是根据取模来取的,但是他会多了没必要的赋值,我还是按照我最初的想法写吧,我是跟之前单调区间一样用数组来记录最大元素,因为后面的元素可以再从前面的元素找,所以我再加一次循环,这次循环跟上一个循环的区别就在于没有了s.pop(),因为这次循环是要查缺的,所以就只需补上漏了的值就好。
https://leetcode.cn/problems/next-greater-element-ii/description/
class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {stack<int>s;vector<int>result(nums.size(),-1);for(int i=0;i<nums.size();i++){while(!s.empty()&&nums[i]>nums[s.top()]){result[s.top()]=nums[i];s.pop();}s.push(i);}if(!s.empty())for(int i=0;i<nums.size();i++){while(!s.empty()&&nums[i]>nums[s.top()]){result[s.top()]=nums[i];s.pop();}}return result;}
};
42.接雨水
再一次感叹单调栈的神奇,这道题用单调栈来做,代码和之前的题相比只多了一点,我们还是把单调栈设置成为从小到大的单调栈,一旦height[i]大于栈顶元素就说明栈顶元素右边比它高的已经找到了,但是求面积的话需要知道栈顶元素的左边比它高的元素,这可怎么找呢?关键就在这,按照单调栈进栈的顺序,比前面的元素小的会放进栈里,所以此时栈里面在栈顶元素的下一个元素就是我们要找的栈顶元素的左边比它高的元素,剩下的就是在左右两边的高的元素里面取一个较小的作为面积的高,然后根据数组下标计算得到宽了。
https://leetcode.cn/problems/trapping-rain-water/submissions/512609053/
class Solution {
public:int trap(vector<int>& height) {int sum=0;stack<int>s;s.push(0);for(int i=1;i<height.size();i++){while(!s.empty()&&height[i]>height[s.top()]){int mid=s.top();s.pop();if(!s.empty()){int high=min(height[s.top()],height[i])-height[mid];int width=i-s.top()-1;sum+=high*width;}}s.push(i);}return sum;}
};