- 原题链接:84. 柱状图中最大的矩形
1- 思路
题目识别
- 识别1 :给定一个数组
heights
,求解柱状图的最大面积
单调栈
- 使用
Stack
来实现,遍历数组,存入下标。 - 本题实现的是一个单调递减栈,目标是找一个以当前为基准,左边第一个比这个小的以及右边第一个比该元素小的元素。
2- 实现
⭐84. 柱状图中最大的矩形——题解思路
class Solution {
public int largestRectangleArea(int[] heights) {
int len = heights.length;
int[] newH = new int[len+2];
int index = 1;
for(int i = 0 ; i < len;i++){
newH[index++] = heights[i];
}
heights = newH;
len = heights.length;
Stack<Integer> st = new Stack<>();
int res = 0;
st.push(0);
// 单调栈
for(int i = 0 ; i < len;i++){
if(heights[i] >= heights[st.peek()]){
st.push(i);
}else{
while(heights[i] < heights[st.peek()]){
int mid = st.peek();
st.pop();
int left = st.peek();
int right = i;
int h = heights[mid];
int width = right-left-1;
res = Math.max(res,h*width);
}
st.push(i);
}
}
return res;
}
}
3- ACM 实现
public class maxArea {
public static int maxA(int[] heights){
int len = heights.length;
int[] newH = new int[len+2];
int index = 1;
for(int i = 1 ; i < len;i++){
newH[index++] = heights[i];
}
heights = newH;
len = heights.length;
Stack<Integer> st = new Stack<>();
int res = 0;
st.push(0);
// 单调栈
for(int i = 0 ; i < len;i++){
if(heights[i] >= heights[st.peek()]){
st.push(i);
}else{
while(heights[i] < heights[st.peek()]){
int mid = st.peek();
st.pop();
int left = st.peek();
int right = i;
int h = heights[mid];
int width = right-left-1;
res = Math.max(res,h*width);
}
st.push(i);
}
}
return res;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
input = input.replace("[","").replace("]","");
String[] parts = input.split(",");
int[] nums = new int[parts.length];
for(int i = 0 ; i < nums.length;i++){
nums[i] = Integer.parseInt(parts[i]);
}
System.out.println("结果是"+maxA(nums));
}
}
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 【Hot100】LeetCode—84. 柱状图中最大的矩形
发表评论 取消回复