前言
这里记录一下陈菜菜的刷题记录,主要应对25秋招、春招
个人背景
211CS本+CUHK计算机相关硕,一年车企软件开发经验
代码能力:有待提高
常用语言:C++
系列文章目录
第53天 :第十章 单调栈part02
`
文章目录
- 前言
- 系列文章目录
- 第53天 :第十章 单调栈part02
- 一、今日任务
- 二、详细布置
- 42. 接雨水
- 提示:
- 样例1:
- 思路
- 实战
- 84.柱状图中最大的矩形
- 提示:
- 样例1:
- 思路
- 实战
- 踩坑
- 总结
一、今日任务
● 42. 接雨水
● 84.柱状图中最大的矩形
二、详细布置
42. 接雨水
题目链接:力扣42
文章讲解:代码随想录
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
提示:
n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105
样例1:
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
思路
这题很经典,码一下,看了题解才知道。
实战
class Solution {
public:int trap(vector<int>& height) {int sum=0;int v;vector<int> left(height.size(),0);vector<int> right(height.size(),0);left[0]=height[0];for(int i=1;i<height.size();i++){left[i]=max(height[i],left[i-1]);}right[height.size()-1]=height[height.size()-1];for(int i=height.size()-2;i>=0;i--){right[i]=max(height[i],right[i+1]);}for(int i=1;i<height.size();i++){v=min(right[i],left[i])-height[i];if(v>0)sum+=v;}return sum; }
};
84.柱状图中最大的矩形
题目链接:力扣84题链接
文章讲解:图文讲解
定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
提示:
1 <= heights.length <=105
0 <= heights[i] <= 104
样例1:
输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10
思路
这题很难。
实战
/*class Solution {
public:int largestRectangleArea(vector<int>& heights) {vector<int> left(heights.size(),0);vector<int> right(heights.size(),0);int maxS=INT_MIN,a=0,mymin=INT_MAX;left[0]=0;/*for(int i=1;i<heights.size();i++){for(int j=i;j>=0;j--)if(heights[j]>=heights[i])left[i]=j;}*//*for(int i=1;i<heights.size();i++){if(heights[i]>heights[left[i-1]])left[i]=i;else if(heights[i]!=0)left[i]=left[i-1];elseleft[i]=i;}right[heights.size()-1]=heights.size()-1;for(int i=heights.size()-2;i>=0;i--){if(heights[i]<heights[right[i+1]])right[i]=i;else if(heights[i]!=0)right[i]=right[i+1];elseright[i]=i;}if(heights.size()==2){if(heights[0]==0||heights[1]==0)return max(heights[0],heights[1]);elsereturn min(heights[0],heights[1])*2;}for(int i=0;i<heights.size();i++){if(heights[i]<mymin)mymin=heights[i];} for(int i=0;i<heights.size();i++){if(heights[right[i]]==heights[left[i]]){a=max(a,mymin*(right[i]-left[i]+1));} else{if(right[i]==left[i])a=max(a,heights[i]);elsea=max(a,heights[i]*(right[i]-left[i]));}if(a>maxS){maxS=a;//index=i;}}return maxS;}
};
*/
class Solution {
public:int largestRectangleArea(vector<int>& heights) {int result = 0;stack<int> st;heights.insert(heights.begin(), 0); // 数组头部加入元素0heights.push_back(0); // 数组尾部加入元素0st.push(0);// 第一个元素已经入栈,从下标1开始for (int i = 1; i < heights.size(); i++) {if (heights[i] > heights[st.top()]) { // 情况一st.push(i);} else if (heights[i] == heights[st.top()]) { // 情况二st.pop(); // 这个可以加,可以不加,效果一样,思路不同st.push(i);} else { // 情况三while (!st.empty() && heights[i] < heights[st.top()]) { // 注意是whileint mid = st.top();st.pop();if (!st.empty()) {int left = st.top();int right = i;int w = right - left - 1;int h = heights[mid];result = max(result, w * h);}}st.push(i);}}return result;}
};
踩坑
这题我的做法过不了一部分样例,码一下,后面改。
总结
今天主要学习了单调栈的一系列操作,今天题目难啊
加油,坚持打卡的第53天。