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     }

 

 

你可能感兴趣的:(LeetCode)