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     }

 

 

posted @ 2013-08-04 21:10  feiling  阅读(228)  评论(0编辑  收藏  举报