leetcode算法总结 —— 栈及单调栈

使用栈

    1. 逆波兰表达式求值(遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中)
    1. 有效的括号
    1. 最长有效括号 (栈记录序号位置)
    1. 最小栈(新建一个栈存储最小值)
    1. 比较含退格的字符串(string就是一个栈)

栈和队列转换

    1. 队列实现栈(两个队列或一个队列实现,两个队列:每次两个队列互转的时候,保留最后一个元素弹出)
    1. 用栈实现队列 (只能用两个栈实现,第二个栈作为缓冲区)

单调栈

单调栈模板:

第一种题型:找到一个数的左右两边的第一个比该数大(波峰)(或者小波谷)的数

下面模板为递增栈:我们可以拿到一个数(波峰)的左右两边第一个小于等于他的值。递增找波峰
如果想拿一个数(波谷)的左右两边第一个比他大的值,则使用递减栈

    //由于最后一位计算如果没有小于的数则栈不会弹出,所以在最前面和最后一位都补位,看具体情况补什么0或-1 等
    stack<int> st;//一般这里记录index
    //遍历数组
    for(int i = 0; i < nums.size(); i++) 
    {
    
    
        //如果当前元素前面存在比他大的元素则进入循环,则我们维护的是递增栈
        while(!st.empty() && nums[i] < st.top()) 
        {
    
    
            //1. 波峰为:当前栈顶元素
            int curNumber = st.top();
            st.pop();
            //2. 弹出后的栈顶元素为:左边比波峰小的第一个值
            int leftValue = st.top();
            //3. 当前遍历到的元素为:右边比波峰小的第一个值
            int rightValue = nums[i]; 
            
        }
        //当前元素入栈
        st.push(nums[i]);
    }
    1. 柱状图中最大的矩形(波峰)
    1. 每日温度(波谷)
    1. 下一个更大元素 I
    1. 下一个更大元素 II(原数组扩大二倍)

第二种题型:栈中留下递增或递减序列,移除波峰或者波谷

利用单调栈性质:单调栈中存储的都是递增或者递减的排列。

    1. 移掉K位数字
    1. 去除重复字母

猜你喜欢

转载自blog.csdn.net/chongbin007/article/details/112741867
今日推荐