代码随想录刷题记录 day52 柱状图中最大的矩形+最终总结
84. 柱状图中最大的矩形
思想
和接雨水的区别在于本题是找到柱子的左右两边第一个小于该柱子的柱子
代码
class Solution {
public int largestRectangleArea(int[] heights) {
//单调栈
//找到每个柱子左右两边第一个小于该柱子的柱子
//栈里存放的是元素的下标 从栈顶到栈底的元素大小 是从大到小的
//考虑以下三种情况
//1.数组的元素小于栈顶的元素
//2.数组的元素等于栈顶的元素
//3.数组的元素大于栈顶的元素
Stack<Integer> stack=new Stack<Integer>();
int [] newHeights =new int[heights.length+2];
for(int i=0;i<heights.length;i++){
newHeights[i+1]=heights[i];
}
heights=newHeights;
// System.out.println(Arrays.toString(newHeights));
stack.push(0);
int res=0;
for(int i=1;i<heights.length;i++){
if(heights[i]>heights[stack.peek()]){
stack.push(i);
}else if(heights[i]==heights[stack.peek()]){
stack.pop();
stack.push(i);
}else{
while(heights[i]<heights[stack.peek()]){
int mid=stack.peek();
stack.pop();
int left=stack.peek();
int right=i;
int w=right-left-1;
int h=heights[mid];
res=Math.max(res,w*h);
}
stack.push(i);
}
}
return res;
}
}
一刷总结
一刷代码随想录的最后几天还感染了新冠,脑子都转不动了,不过第一次坚持连续刷这么久的算法题,有些题目也二刷了,收获还是很大的。
- 算法的进步:按照数组、链表、哈希表、字符串、双指针法、栈与队列、二叉树、回溯算法、贪心算法、动态规划、单调栈,对各类题型都学习了对应的方法论,形成了做题的套路或者说是思想,很多是之前没有接触过的。
- 习惯的养成:每日博客的撰写,现在回过头去看看之前写的博客,发现好多写的还是很粗糙的,导致在二刷的时候看自己的笔记没办法较快的理解解题的思路,后续二刷的时候还是得继续改进。但是也借此次机会,帮助自己养成撰写博客的习惯。
最后,也感谢代码随想录、Carl、助教,也感谢坚持到最后的自己。
路漫漫其修远兮,吾将上下而求索。
参考:代码随想录