当前位置: 首页 > article >正文

力扣hot100——栈

20. 有效的括号

class Solution {
public:
    bool isValid(string s) {
        stack<char> stk;
        auto check = [&](char ch) -> bool {
            if (stk.empty()) return false;
            char t = stk.top();
            if (t == '(' && ch == ')') return true;
            if (t == '{' && ch == '}') return true;
            if (t == '[' && ch == ']') return true;
            return false;
            };
        for (auto ch : s) {
            if (ch == '(' || ch == '[' || ch == '{') stk.push(ch);
            else {
                if (check(ch)) stk.pop();
                else return false;
            }
        }
        return stk.empty();
    }
};

栈模拟即可

155. 最小栈

class MinStack {
public:
    stack<int> stk1;
    stack<int> stk2;
    MinStack() {
        stk2.push(INT_MAX);
    }

    void push(int x) {
        stk1.push(x);
        if (x <= stk2.top()) stk2.push(x);
    }

    void pop() {
        int x = stk1.top();
        stk1.pop();
        if (stk2.top() == x) stk2.pop();
    }

    int top() {
        return stk1.top();
    }

    int getMin() {
        return stk2.top();
    }
};

stk1正常的栈,stk2维护栈的最小值,每次入栈时判断x是不是小于等于stk2.top(), 如果不是根据栈后进先出的特性,就算push进stk2是冗余的

394. 字符串解码

class Solution {
public:
    string decodeString(string s) {
        string str = "";
        int k = 0;
        stack<int> stk1;
        stack<string> stk2;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '[') {
                stk1.push(k);
                stk2.push(str);
                k = 0;
                str = "";
            }
            else if (s[i] == ']') {
                int t = stk1.top();
                stk1.pop();
                string tmp = stk2.top();
                stk2.pop();
                for (int i = 0; i < t; i++) tmp += str;
                str = tmp;
            }
            else if (s[i] >= '0' && s[i] <= '9') k = k * 10 + s[i] - '0';
            else str += s[i];
        }
        return str;
    }
};

两个栈,一个栈“外层”的放大倍数,另一个栈存外层,但是不参与本次循环的字符串

739. 每日温度

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& a) {
        stack<int> stk;
        vector<int> ans;
        for (int i = a.size() - 1; i >= 0; i--) {
            while (stk.size() && a[i] >= a[stk.top()]) stk.pop();
            if (stk.empty()) ans.push_back(0);
            else ans.push_back(stk.top() - i);
            stk.push(i);
        }
        reverse(ans.begin(), ans.end());
        return ans;
    }
};

单调栈

84. 柱状图中最大的矩形 

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int n = heights.size();
        vector<int> a(n + 2);
        a[0] = -1;
        for (int i = 1; i <= n; i++) a[i] = heights[i - 1];
        a[n + 1] = -1;
        heights.clear();

        int ans = 0;
        stack<int> stk;
        stk.push(0);

        vector<int> l(n + 2, 0);
        vector<int> r(n + 2, 0);
        for (int i = 1; i <= n; i++) {
            while (stk.size() && a[i] <= a[stk.top()]) stk.pop();
            if (stk.size()) l[i] = stk.top();
            stk.push(i);
        }

        while (stk.size()) stk.pop();

        stk.push(n + 1);
        for (int i = n; i >= 1; i--) {
            while (stk.size() && a[i] <= a[stk.top()]) stk.pop();
            if (stk.size()) r[i] = stk.top();
            stk.push(i);
        }

        for (int i = 1; i <= n; i++) {
            ans = max(ans, (r[i] - l[i] - 1) * a[i]);
        }

        return ans;
    }
};

求出每根柱子左边小于它的最近下标和右边小于它的最近下标,正着反着跑两遍单调栈即可


http://www.kler.cn/a/469050.html

相关文章:

  • 玉米识别数据集,4880张图,正确识别率可达98.6%,支持yolo,coco json,pasical voc xml格式的标注,可识别玉米
  • 链上数据分析基础课:Puell倍数(Puell Multiple)
  • Python连接和操作Elasticsearch详细指南
  • 【golang】go errors 处理错误追踪打印堆栈信息
  • 关系分类(RC)模型和关系抽取(RE)模型的区别
  • ESP8266+STM32+阿里云保姆级教程(AT指令+MQTT)
  • 在科技查新中怎样判定其项目的新颖性?
  • 单片机复位电路基本理解教程文章·含上拉电阻理解电容开路理解!!!
  • Python中对象序列化以及反序列化的方法
  • Day 22:数据库与 Spring Data JPA
  • Unity3D仿星露谷物语开发17之空库存栏UI
  • vue3如何实现防抖?
  • atrust异常导致ERR_NETWORK_CHANGED
  • 2025-01-04 Unity插件 YodaSheet2 —— 基础用法
  • vscode中设置默认格式化工具pretter
  • 【图像处理】数据集合集!
  • 【软考网工笔记】计算机基础理论与安全——网络安全
  • 借助提示词工程,解锁高效应用开发之道
  • 计算机网络--UDP和TCP课后习题
  • 限时特惠,香港服务器,低至53元/年
  • 数据结构漫游记:初识栈(stack)
  • 探秘 AI Agent 之 Coze 智能体:从简介到搭建全攻略(4/30)
  • 超大规模分类(二):InfoNCE
  • ffmpeg之yuv格式转h264
  • 人工智能-Python网络编程-TCP
  • 数据库基础:SQL 与 NoSQL 的区别与应用场景