代码随想录第63天(单调栈):● 503.下一个更大元素II ● 42. 接雨水

一、下一个更大元素II

题目描述:

代码随想录第63天(单调栈):● 503.下一个更大元素II ● 42. 接雨水_第1张图片

思路和想法:

        这道题的主体思路是使用单调栈获得下一个更大元素,但需注意的是它是循环搜索的,未找到时,会再从头搜索一遍看是否有下一个更大元素。但至多循环一次就可以出结果,这里模拟两次遍历nums即可。 

#include
#include
using namespace std;
class Solution {
public:
    vector nextGreaterElements(vector& nums) {
        stack st;
        vector result(nums.size(),-1);
        st.push(0);

        for (int i = 1; i < 2 * nums.size(); i++)
        {
            if (nums[i % nums.size()] <= nums[st.top()])
            {
                st.push(i % nums.size());
            } 
            while (!st.empty() && nums[i % nums.size()] > nums[st.top()] )
            {
                result[st.top()] = nums[i % nums.size()];
                st.pop();
            }
            st.push(i % nums.size());          
        }
        return result;
    }
};

二、接雨水

题目描述:

代码随想录第63天(单调栈):● 503.下一个更大元素II ● 42. 接雨水_第2张图片

 思路和想法:

        这道题目采用单调栈是可以解决的,使用单调栈主要分析入栈时,当前遍历元素和栈顶元素之间的关系,这里有三种关系height[i] < height[st.top()],height[i] == height[st.top()]以及height[i] > height[st.top()]。

        这里栈头到栈底的顺序为从小到大,这里栈头元素是凹槽底部的柱子,栈头第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子。

(1)height[i] < height[st.top()]时,入栈st.push(i);

(2)height[i] == height[st.top()]时,相同元素留一个,先弹出,之后再入栈st.push(i)

(3)height[i] > height[st.top()]时,记录计算(行),凹槽的体积为h * w,这里比较难懂,h = min(height[st.top()], height[i]) - height[mid]; w = i - st.top() - 1。

#include
#include
#include
using namespace std;

class Solution {
public:
    int trap(vector& height) {
        stack st;
        int result = 0;         
        if (height.size() <= 2) return result;
        st.push(0);

        for (int i = 1; i < height.size(); i++)
        {
            if (height[i] < height[st.top()])
            {
                st.push(i);
            }
            if(height[i] == height[st.top()]){
                st.pop();
                st.push(i);
            }else{
                while (!st.empty() && height[i] > height[st.top()]) { 
                    int mid = st.top();
                    st.pop();
                    if (!st.empty()) {
                        int h = min(height[st.top()], height[i]) - height[mid];
                        int w = i - st.top() - 1; 
                        result += h * w;
                    }
                } 
                st.push(i);               
            }
        }
        return result;
        
    }
};

你可能感兴趣的:(代码随想录感想,算法,leetcode,c++)