您的位置:首页 > 其它

LeetCode 84 Largest Rectangle in Histogram

2016-10-26 17:33 501 查看
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
.

Runtime: 3
ms runtime beats 99.39% of java submissions.

public int largestRectangleArea(int[] heights) {
if (heights == null || heights.length == 0) return 0;
return getMax(heights, 0, heights.length);
}

int getMax(int[] heights, int s, int e) {
if (s + 1 >= e) return heights[s];
int min = s;//柱状图的最低点
boolean sorted = true;//所有柱子是否按照升序
for (int i = s; i < e; i++) {
if (i > s && heights[i] < heights[i - 1]) sorted = false;
if (heights[min] > heights[i]) min = i;
}
if (sorted) {//如果正序的话就简单了直接计算
int max = 0;
for (int i = s; i < e; i++) {
max = Math.max(max, heights[i] * (e - i));
}
return max;
}
//不是正序的话,就以最低点为准,划分左右两个区域分别计算,最后再和加上min的比较
int left = (min > s) ? getMax(heights, s, min) : 0;
int right = (min < e - 1) ? getMax(heights, min + 1, e) : 0;
return Math.max(Math.max(left, right), (e - s) * heights[min]);
}

使用栈。参考http://www.cnblogs.com/yrbbest/p/4437139.html Runtime: 21
ms

public int largestRectangleArea2(int[] height) {
if (height == null || height.length == 0) return 0;
Stack<Integer> stack = new Stack<Integer>();
int max = 0;
for (int i = 0; i <= height.length; i++) {
int curt = (i == height.length) ? -1 : height[i];
while (!stack.isEmpty() && curt <= height[stack.peek()]) {
int h = height[stack.pop()];
int w = stack.isEmpty() ? i : i - stack.peek() - 1;
max = Math.max(max, h * w);
}
stack.push(i);
}

return max;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode 设计 结构