题目:
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 height = [2,1,5,6,2,3]
,
return 10
.
题解:
网上学来神算法。用堆栈保存height的index。
C++版:
class Solution: # @param {integer[]} height # @return {integer} def largestRectangleArea(self, height): height.append(0) maxArea = 0 i = 0 index = [] while i < len(height): if len(index) == 0 or height[index[-1]] <= height[i]: index.append(i) i += 1 else: t = index.pop() if len(index) == 0: maxArea = max(maxArea, height[t] * i) else: maxArea = max(maxArea, height[t] * (i - 1 - index[-1])) return maxArea
public class Solution { public int largestRectangleArea(int[] height) { int[] h = new int[height.length + 1]; h = Arrays.copyOf(height, height.length + 1); Stack<Integer> index = new Stack<>(); int i = 0; int maxArea = 0; while(i < h.length) { if(index.isEmpty() || h[index.peek()] <= h[i]) { index.push(i++); } else { int t = index.pop(); maxArea = Math.max(maxArea, h[t] * (index.isEmpty() ? i : i - 1 - index.peek())); } } return maxArea; } }
class Solution: # @param {integer[]} height # @return {integer} def largestRectangleArea(self, height): height.append(0) maxArea = 0 i = 0 index = [] while i < len(height): if len(index) == 0 or height[index[-1]] <= height[i]: index.append(i) i += 1 else: t = index.pop() if len(index) == 0: maxArea = max(maxArea, height[t] * i) else: maxArea = max(maxArea, height[t] * (i - 1 - index[-1])) return maxArea