zoukankan      html  css  js  c++  java
  • 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     }
  • 相关阅读:
    photoSlider-原生js移动开发轮播图、相册滑动插件
    JavaScript库开发者们的规则
    如何提高手机APP的用户体验?
    html清除浮动的6种方法
    JS内存泄露常见原因
    web前端开发规范文档
    jQuery无缝循环开源多元素动画轮播jquery.slides插件
    9种CSS3炫酷图片展开预览展示动画特效
    纯css3 transforms 3D文字翻开翻转3D开放式效果
    html5+css3第一屏滚屏动画效果
  • 原文地址:https://www.cnblogs.com/feiling/p/3236953.html
Copyright © 2011-2022 走看看