leetcode -- Largest Rectangle in Histogram TODO O(N)
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
.
本题思路和Trapping Rain Water差不多,计算每个idx的left bound 和right bound(两个bound都需大于height[idx])
时间复杂度为:O(n^2)
1 public int largestRectangleArea(int[] height) { 2 // Start typing your Java solution below 3 // DO NOT write main() function 4 int len = height.length; 7 int[] area = new int[len]; 8 9 for(int i = 0; i < len; i++){ 10 int h = height[i]; 11 12 int m = i - 1; 13 for(; m >= 0; m --){ 14 if(height[m] < h){ 15 break; 16 } 17 } 18 m ++; 19 20 int n = i + 1; 21 for(; n < len; n ++){ 22 if(height[n] < h){ 23 break; 24 } 25 } 26 n --; 27 28 int width = (n - m) + 1; 29 area[i] = h * width; 30 } 31 int max = 0; 32 for(int i = 0; i < len; i++){ 33 if(area[i] > max){ 34 max = area[i]; 35 } 36 } 37 return max; 38 }
可以过小数据,大数据挂在输入[1,1,1,1,1,1........] ,说明有很多重复计算,做了一个简单改进,当前高度与上一个相同时,直接将area[i] = area[i-1](line 12-15)
1 public int largestRectangleArea(int[] height) { 2 // Start typing your Java solution below 3 // DO NOT write main() function 4 int len = height.length; 7 int[] area = new int[len]; 8 9 for(int i = 0; i < len; i++){ 10 int h = height[i]; 11 12 if(i >= 1 && h == height[i - 1]){ 13 area[i] = area[i - 1]; 14 continue; 15 } 16 17 int m = i - 1; 18 for(; m >= 0; m --){ 19 if(height[m] < h){ 20 break; 21 } 22 } 23 m ++; 24 25 int n = i + 1; 26 for(; n < len; n ++){ 27 if(height[n] < h){ 28 break; 29 } 30 } 31 n --; 32 33 int width = (n - m) + 1; 34 area[i] = h * width; 35 } 36 int max = 0; 37 for(int i = 0; i < len; i++){ 38 if(area[i] > max){ 39 max = area[i]; 40 } 41 } 42 return max; 43 }