IT技術(shù)小屋

          秋風(fēng)秋雨,皆入我心

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            38 隨筆 :: 1 文章 :: 19 評論 :: 0 Trackbacks
          算法很簡單,核心思想是:對某個值A(chǔ)[i]來說,能trapped的最多的water取決于在i之前最高的值leftMostHeight[i]和在i右邊的最高的值rightMostHeight[i]。(均不包含自身)。如果min(left,right) > A[i],那么在i這個位置上能trapped的water就是min(left,right) – A[i]。
          有了這個想法就好辦了,第一遍從左到右計算數(shù)組leftMostHeight,第二遍從右到左計算rightMostHeight,在第二遍的同時就可以計算出i位置的結(jié)果了,而且并不需要開空間來存放rightMostHeight數(shù)組。
          時間復(fù)雜度是O(n),只掃了兩遍。

           1 public class TrappingRainWater {
           2     public int trap(int A[], int n) {
           3         if (n <= 2)
           4             return 0;
           5 
           6         int[] lmh = new int[n];
           7         lmh[0] = 0;
           8         int maxh = A[0];
           9         for (int i = 1; i < n; ++i) {
          10             lmh[i] = maxh;
          11             if (maxh < A[i])
          12                 maxh = A[i];
          13         }
          14         int trapped = 0;
          15         maxh = A[n - 1];
          16         for (int i = n - 2; i > 0; --i) {
          17             int left = lmh[i];
          18             int right = maxh;
          19             int container = Math.min(left, right);
          20             if (container > A[i]) {
          21                 trapped += container - A[i];
          22             }
          23             if (maxh < A[i])
          24                 maxh = A[i];
          25         }
          26         return trapped;
          27     }
          28 }
          posted on 2014-01-14 09:16 Meng Lee 閱讀(230) 評論(0)  編輯  收藏 所屬分類: Leetcode
          主站蜘蛛池模板: 宾川县| 庆云县| 林周县| 于田县| 铁力市| 泌阳县| 安吉县| 堆龙德庆县| 余干县| 冕宁县| 积石山| 海口市| 黔南| 赤峰市| 布拖县| 龙游县| 马鞍山市| 武汉市| 宁化县| 苏尼特左旗| 杨浦区| 化隆| 大冶市| 乌兰浩特市| 同江市| 清涧县| 桂东县| 镇宁| 鄱阳县| 平遥县| 沾化县| 嫩江县| 洪江市| 综艺| 三门县| 原阳县| 武汉市| 噶尔县| 新疆| 永安市| 汨罗市|