
栈和队列
cx_cs
这个作者很懒,什么都没留下…
展开
-
71. 简化路径
无原创 2023-03-08 10:46:19 · 55 阅读 · 0 评论 -
227. 基本计算器 II
要求:加减乘除运算思路:存前一个符号,乘除先算class Solution {public: int calculate(string s) { vector<int> stk; char preSign = '+'; int num = 0; int n = s.length(); for (int i = 0; i < n; ++i) { if (isdigit(s[i原创 2022-04-16 14:11:35 · 166 阅读 · 0 评论 -
218. 天际线问题
要求:https://leetcode-cn.com/problems/the-skyline-problem/思路:天际线,题目用的是左端点。某个点处的天际线显然是包含了该点的所有矩形的最大高度,但是这个点是矩形右端点不算,如例一红色右端点其实没啥用,所以包含的定义是矩形除掉它右端点。如果遇到一个矩形左端点,它比当前最大高度高则天际线往上走,遇到右端点那天际线要下降到包含该点的最大高度。class Solution {public: vector<vector<int>原创 2022-04-11 14:08:42 · 142 阅读 · 0 评论 -
150. 逆波兰表达式求值
要求:1,2,+类似的表达式计算思路:栈class Solution {public: int evalRPN(vector<string>& tokens) { stack<int> stk; // 牛一个栈 for (string& token : tokens) { // 遍历tokens if (token == "+" || token == "-" || token == "*" ||原创 2022-04-05 19:46:57 · 395 阅读 · 0 评论 -
85. 最大矩形
要求:给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。思路:法一:暴力,会超时。首先算出每个点左边的1(含点本身)的数量,然后以每个点为矩形右下角,枚举其高度即可法二:单调栈。对每一列应用单调栈,当作84题class Solution {public: int maximalRectangle(vector<vector<char>>& matrix) { if (ma原创 2022-03-20 20:41:17 · 170 阅读 · 0 评论 -
84. 柱状图中最大的矩形
要求:构造矩形思路:暴力是在每个矩形处找以它为高度的最大面积,即找它左右第一个比它矮的之间的。单调栈:遇到比栈顶矮的就能计算栈顶了,高的就入栈class Solution {public: int largestRectangleArea(vector<int> &heights) { unsigned long size = heights.size(); if (size == 1) { return height原创 2022-03-19 19:51:24 · 109 阅读 · 0 评论 -
剑指 Offer 59 - II. 队列的最大值
要求:rt思路:双端队列维护class MaxQueue {public: queue<int> q; deque<int> d; MaxQueue() { } int max_value() { if(d.empty())return -1; return d.front(); } void push_back(int value) { while(!原创 2022-03-10 17:16:45 · 58 阅读 · 0 评论 -
剑指 Offer 59 - I. 滑动窗口的最大值
要求:找出每连续k个元素的最大值思路:暴力不行法一:大根堆,存好值和下标,时间O(nlogn)空间O(n)class Solution {public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { if(nums.size()==0)return {}; priority_queue<pair<int,int>> q;原创 2022-03-10 14:25:17 · 60 阅读 · 0 评论 -
剑指 Offer 33. 二叉搜索树的后序遍历序列
要求:判断是否为一个后序思路:法一:最后一个为根,因为二叉搜索树根右边所有都大于它,所以从前找到第一个大于根的以此划分左右子树,递归。如果在右子根往后找到一个比根小的那么返回falseclass Solution {public: bool dfs(int start,int end,vector<int>& postorder){ if(start>=end)return true; int rootval=postorder[en原创 2022-03-05 15:10:32 · 208 阅读 · 0 评论 -
剑指 Offer 31. 栈的压入、弹出序列
要求:rt思路:整理一下class Solution {public: bool validateStackSequences(vector<int>& pushed, vector<int>& popped) { stack<int> s; int po=0; for(int num:pushed){ s.push(num); while(!s.原创 2022-03-04 22:24:50 · 46 阅读 · 0 评论 -
剑指 Offer 09. 用两个栈实现队列
要求:rt思路:如果else要重复if的操作那么考虑if的条件和else换一下class CQueue {private: stack<int> in; stack<int> out;public: CQueue() { } void appendTail(int value) { in.push(value); } int deleteHead() {原创 2022-02-28 20:28:42 · 55 阅读 · 0 评论 -
503. 下一个更大元素 II
要求:每个元素的下一个更大元素距离,可以循环思路:单调栈,数组拉长为2n-1,即倒数第二个元素,即i<2n-1class Solution {public: vector<int> nextGreaterElements(vector<int>& nums) { stack<int> s; int n=nums.size(); vector<int> v(n,-1);原创 2022-01-19 14:08:39 · 57 阅读 · 0 评论 -
739. 每日温度
要求:每个元素后面第一个比他大的,距离思路:单调栈,遇到栈里小的先弹出来class Solution {public: vector<int> dailyTemperatures(vector<int>& temperatures) { stack<int> s; int n=temperatures.size(); vector<int> v(n); for(int i=0原创 2022-01-19 13:45:56 · 146 阅读 · 0 评论 -
20. 有效的括号
要求:匹配左右括号思路:栈class Solution {public: bool isValid(string s) { stack<char> st; for(char &c:s){ if(c=='('||c=='{'||c=='[')st.push(c); else{ if(st.empty())return false; c原创 2022-01-19 13:07:58 · 578 阅读 · 0 评论 -
155. 最小栈
要求:获取最小值O(1)思路:要额外维护一个最小值栈class MinStack {private: stack<int> s; stack<int> mins; int minval;public: MinStack() { minval=0x7fffffff; } void push(int val) { s.push(val); minval=min(val,min原创 2022-01-19 12:16:19 · 78 阅读 · 0 评论 -
225. 用队列实现栈
要求:rt思路:一个对列即可class MyStack {private: queue<int> q;public: MyStack() { } void push(int x) { int n=q.size(); q.push(x); while(n-->0){ q.push(q.front()); q.pop(); }原创 2022-01-19 12:04:35 · 165 阅读 · 0 评论 -
232. 用栈实现队列
要求:rt思路:class MyQueue {private: stack<int> in; stack<int> out;public: MyQueue() { } void push(int x) { in.push(x); } int pop() { int x=peek(); out.pop(); return x; }原创 2022-01-19 11:13:55 · 131 阅读 · 0 评论