程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Trapping Rain Water -- LeetCode

Trapping Rain Water -- LeetCode

編輯:C++入門知識

 
這道題比較直接的做法類似Longest Palindromic Substring中的第一種方法,對於每一個bar往兩邊掃描,找到它能承受的最大水量,然後累加起來即可。每次往兩邊掃的復雜度是O(n),對於每個bar進行處理,所以復雜度是O(n^2),空間復雜度是O(1)。思路比較清晰,就不列代碼了,有興趣的朋友可以實現一下哈。

下面我們說說優化的算法。這種方法是基於動態規劃的,基本思路就是維護一個長度為n的數組,進行兩次掃描,一次從左往右,一次從右往左。第一次掃描的時候維護對於每一個bar左邊最大的高度是多少,存入數組對應元素中,第二次掃描的時候維護右邊最大的高度,並且比較將左邊和右邊小的最大高度(我們成為瓶頸)存入數組對應元素中。這樣兩遍掃描之後就可以得到每一個bar能承受的最大水量,從而累加得出結果。這個方法只需要兩次掃描,所以時間復雜度是O(2*n)=O(n)。空間上需要一個長度為n的數組,復雜度是O(n)。代碼如下:

 

public int trap(int[] A) {
    if(A==null || A.length==0)
        return 0;
    int max = 0;
    int res = 0;
    int[] container = new int[A.length];
    for(int i=0;i=0;i--)
    {
        container[i] = Math.min(max,container[i]);
        max = Math.max(max,A[i]);
        res += container[i]-A[i]>0?container[i]-A[i]:0;
    }    
    return res;
}
這個方法算是一種常見的技巧,從兩邊各掃描一次得到我們需要維護的變量,通常適用於當前元素需要兩邊元素來決定的問題,非常類似的題目是Candy,有興趣的朋友可以看看哈。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved