Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.
Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3]
.
The largest rectangle is shown in the shaded area, which has area = 10
unit.
For example,
Given heights = [2,1,5,6,2,3]
,
return 10
.
看到一篇博客,用的是stack解法,【LeetCode】84. Largest Rectangle in Histogram
先求出每个不递减可以达到的最大值,再把分立的这些不递减的序列合并,这部分可以先用stack构造出完整的不递减序列
import java.util.Stack;
public class Solution {
public int largestRectangleArea(int[] heights) {
Stack<Integer> stack = new Stack<Integer>();
int max = 0, cnt = 0;
for(int i=0; i<heights.length; i++) {
if(stack.isEmpty() || stack.peek() <= heights[i]) {
stack.push(heights[i]);
}
else {
// 求出局部不递减序列的最大矩形面积
cnt = 0;
while(!stack.isEmpty() && stack.peek() > heights[i]) {
cnt ++;
max = Math.max(max, stack.pop()*cnt);
}
// 把大于当前的出栈,构造不递减序列
while(cnt >= 0) {
stack.push(heights[i]);
cnt --;
}
}
}
// 求出全局可合并的最大面积
int len = 1;
while(!stack.isEmpty()) {
max = Math.max(max, stack.pop()*len);
len ++;
}
return max;
}
}
https://www.geeksforgeeks.org/largest-rectangle-under-histogram/
考虑当前index为选取的区间最短的情况
package l84;
import java.util.Stack;
class Solution {
public int largestRectangleArea(int[] height) {
Stack<Integer>st=new Stack<Integer>();
int res = 0;
int[]a = new int[height.length+1];
for(int i=0;i<height.length;i++)a[i]=height[i];
a[height.length]=0;
for(int i=0; i<a.length; i++) {
while(!st.isEmpty() && a[st.peek()]>=a[i]) {
int idx = st.pop();
int width = i-(st.isEmpty()?-1:st.peek())-1;
res = Math.max(res, a[idx]*width);
}
st.add(i);
}
return res;
}
public static void main(String[] args) {
Solution s=new Solution();
System.out.println(s.largestRectangleArea(new int[]{2,1,5,6,2,3}));
System.out.println(s.largestRectangleArea(new int[]{1}));
}
}
类似的用stack求解的如: 32. Longest Valid Parentheses