原题链接:https://oj.leetcode.com/problems/largest-rectangle-in-histogram/
这题很难。没有思路。
首先应该会The naive solution. Time = O(n_2), but time limit exceeds.
public class Solution {
public int largestRectangleArea(int[] height) {
//naive solution: start the rectangle with each bar. O(n_2)
int maxArea = 0;
for(int i = 0; i < height.length; i++){
int minH = height[i];
for(int j = i+1; j < height.length; j++){
minH = Math.min(minH, height[j]);
maxArea = Math.max(maxArea, minH * (j-i+1));
}
}
return maxArea;
}
}
参考戴的代码,维护一个递增的栈, 记录高度数组的Indices. Time O(n), Space O(n)
http://www.cnblogs.com/lichen782/p/leetcode_Largest_Rectangle_in_Histogram.html
public class Solution {
public int largestRectangleArea(int[] height) {
int maxArea = 0;
Stack<Integer> stack = new Stack<Integer>();
for(int i = 0; i < height.length; i++){
if(stack.isEmpty() || height[i] >= height[stack.peek()]){
stack.push(i);
}
else{
int start = stack.pop();
int width = stack.isEmpty()? i : i - stack.peek()-1;
maxArea = Math.max(maxArea, height[start] * width);
i--;
}
}
while(!stack.isEmpty()){
int start = stack.pop();
int width = stack.isEmpty()? height.length : height.length - stack.peek() - 1;
maxArea = Math.max (maxArea, height[start] * width);
}
return maxArea;
}
}