【代码随想录】Day58~Day60单调栈

单调栈的作用

就是用一个栈来记录我们遍历过的元素

单调栈里存放元素下标i就可以了,如果要使用对应元素,直接T[i]就可以获取到

从栈头到栈尾-递增的话-栈里要加入一个元素i的时候,才知道栈顶元素在数组中右面第一个比栈顶元素大的元素是i

题目

LeetCode:739.每日温度

解法

将下标存放进单调栈中

当前遍历的元素和栈顶元素进行比较T[i]和T[st.pop()]

T[i]==T[st.pop()] 入栈

T[i]>T[st.pop()] 记录结果

T[i]

class Solution {
public:
    vector dailyTemperatures(vector& temperatures) {
        stack st;
        vector reulst(temperatures.size(),0);
        st.push(0);//放入第一个元素
        for(int i=1;itemperatures[st.top()]){
                reulst[st.top()]=i-st.top();
                st.pop();
                }
                st.push(i);
            }
        }
        return reulst;
    }
};

LeetCode:496.下一个更大

解法

class Solution {
public:
    vector nextGreaterElement(vector& nums1, vector& nums2) {
        vector result(nums1.size(),-1); //结果数组的长度与1相等
        stack st;
        if(nums1.size()==0) return result;
        unordered_map umap;
        //对数组1进行处理 建立哈希表
        for(int i=0;inums2[st.top()]){
                    //判断元素是否出现过
                    if(umap.count(nums2[st.top()])>0){
                        int index=umap[nums2[st.top()]];
                        result[index]=nums2[i];
                    }
                    st.pop();
                }
                st.push(i);
            }
        }
        return result;
        }
};

LeetCode:503.下一个更大元素II

用取模的过程模拟成环的遍历

for(i=0;i

i%nums.size()

}

class Solution {
public:
    vector nextGreaterElements(vector& nums) {
        vector result(nums.size(),-1);
        stack st;
        st.push(0);//放入第一个元素
        for(int i=1;inums[st.top()]){
                    result[st.top()]=nums[i%nums.size()];
                    st.pop();
                }
                st.push(i%nums.size());
            }
        }
        return result;
    }
};

LeetCode:42.接雨水

class Solution {
public:
    int trap(vector& height) {
        stack st;
        st.push(0);
        int sum=0;
        //从1开始遍历所有柱子
        for(int i=1;iheight[st.top()]){
                    int mid=height[st.top()];
                    st.pop();
                    if(!st.empty()){
                        int h=min(height[i],height[st.top()])-mid;
                        int w=i-st.top()-1;
                        sum+=h*w;
                    }
                }
                st.push(i);
            }
        }
        return sum;
    }
};

LeetCode:84.柱状图中最大的矩形

class Solution {
public:
    int largestRectangleArea(vector& heights) {
        int result=0;
        stack st;
        heights.insert(heights.begin(), 0); // 数组头部加入元素0
        heights.push_back(0); // 数组尾部加入元素0

        st.push(0);
        for(int i=1;i=heights[st.top()]){
                st.push(i);
            }
            //条件2 小于的情况
            else{
                while(!st.empty()&&heights[i]

感觉是最难理解的一部分了&完结撒花

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