LeetCode 84 Largest Rectangle in Histogram

来源:互联网 发布:fzltchjw gb1 0 mac 编辑:程序博客网 时间:2024/04/30 15:00

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;}



0 0
原创粉丝点击