Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【LeetCode 热题 100】有效的括号 / 最小栈 / 字符串解码 / 柱状图中最大的矩形

【LeetCode 热题 100】有效的括号 / 最小栈 / 字符串解码 / 柱状图中最大的矩形

作者头像
_小羊_
发布于 2025-05-21 04:22:27
发布于 2025-05-21 04:22:27
4700
代码可运行
举报
文章被收录于专栏:C++C++
运行总次数:0
代码可运行

有效的括号
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    bool isValid(string s) {
        stack<char> st;
        for (char e : s)
        {
            if (st.empty()) st.push(e);
            else if (st.top() == '(' && e == ')' || st.top() == '{' && e == '}'
                || st.top() == '[' && e == ']') st.pop();
            else st.push(e);
        }
        return st.empty();
    }
};

最小栈
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MinStack {
    stack<int> st;
    stack<int> minst;
public:
    MinStack() {
        
    }
    
    void push(int val) {
        st.push(val);
        if (minst.empty() || val <= minst.top())
        {
            minst.push(val);
        }
    }
    
    void pop() {
        if (st.top() == minst.top())
        {
            minst.pop();
        }
        st.pop();
    }
    
    int top() {
        return st.top();
    }
    
    int getMin() {
        return minst.top();
    }
};

字符串解码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    string decodeString(string s) {
        int i = 0;
        return dfs(s, i);
    }
    string dfs(const string& s, int& i)
    {
        string str;
        while (i < s.size() && s[i] != ']')
        {
            if (isdigit(s[i]))
            {
                int num = 0;
                while (i < s.size() && s[i] != '[')
                {
                    num = num * 10 + s[i++] - '0';
                }
                i++; // 跳过'['
                string tmp = dfs(s, i);
                i++; // 跳过']'
                while (num--) str += tmp;
            }
            else str += s[i++];
        }
        return str;
    }
};

每日温度
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        int n = temperatures.size();
        stack<int> st;
        vector<int> res(n);
        for (int i = 0; i < n; i++)
        {
            while (st.size() && temperatures[st.top()] < temperatures[i])
            {
                int t = st.top();
                st.pop();
                res[t] = i - t;
            }
            st.push(i);
        }
        return res;
    }
};

柱状图中最大的矩形

  1. 单调递增栈:分别从左向右和从右向左遍历,找到每个柱子左边和右边第一个比它矮的柱子位置。
  2. 计算宽度:对于每个柱子,其左右边界之间的距离即为矩形的宽度,高度为当前柱子的高度。
  3. 求最大值:遍历所有可能的矩形,找出面积最大的一个。

单调栈。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int n = heights.size();
        vector<int> left(n), right(n);
        stack<int> st;
        for (int i = 0; i < n; i++)
        {
            while (st.size() && heights[st.top()] >= heights[i])
            {
                st.pop();
            }
            left[i] = st.empty() ? -1 : st.top();
            st.push(i);
        }
        st = stack<int>();
        for (int i = n - 1; i >= 0; i--)
        {
            while (st.size() && heights[st.top()] >= heights[i])
            {
                st.pop();
            }
            right[i] = st.empty() ? n : st.top();
            st.push(i);
        }
        int res = 0;
        for (int i = 0; i < n; i++)
        {
            res = max(res, (right[i] - left[i] - 1) * heights[i]);
        }
        return res;
    }
};

优化。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int n = heights.size();
        vector<int> left(n, -1), right(n, n);
        stack<int> st;
        for (int i = 0; i < n; i++)
        {
            while (st.size() && heights[st.top()] > heights[i])
            {
                right[st.top()] = i;
                st.pop();
            }
            if (st.size()) left[i] = st.top(); 
            st.push(i);
        }
        int res = 0;
        for (int i = 0; i < n; i++)
        {
            res = max(res, (right[i] - left[i] - 1) * heights[i]);
        }
        return res;
    }
};

数组中的第K个最大元素
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        int n = nums.size();
        for (int i = n - 2 / 2; i >= 0; i--)
        {
            adjust_down(nums, i, n);
        }
        while (--k)
        {
            swap(nums[0], nums[--n]);
            adjust_down(nums, 0, n);
        }
        return nums[0];
    }
    void adjust_down(vector<int>& nums, int parent, int n)
    {
        int child = 2 * parent + 1;
        while (child < n) 
        {
            if (child + 1 < n && nums[child + 1] > nums[child]) child++;
            if (nums[child] > nums[parent])
            {
                swap(nums[child], nums[parent]);
                parent = child;
                child = 2 * parent + 1;
            }
            else break;
        }
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验