LeetCode - Trapping Rain Water | Darren's Blog



Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining. For example, given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.
Rain Water Trap
public int trap(int[] A) {
        if (A == null || A.length == 0)
            return 0;
        int n = A.length;
        // Used to record the maximum height to the left and the right of each bar
        int[] maxHeights = new int[n];
        // Scan from left to right, find the maximum height to the left of each bar
        int maxHeight = 0;
        for (int i = 0; i < n; i++) {
            maxHeights[i] = maxHeight;
            maxHeight = Math.max(maxHeight, A[i]);
        }
        // Scan from right to left, find the maximum height to the right of each bar
        // The minimum of them is the height of the water (if any) on the bar
        // The difference between the height of the water and that of the bar is the
        // volume of the water on that bar
        maxHeight = 0;
        int volume = 0;     // Accumulated volume of water
        for (int i = n-1; i >= 0; i--) {
            maxHeights[i] = Math.min(maxHeight, maxHeights[i]);
            maxHeight = Math.max(maxHeight, A[i]);
            if (maxHeights[i] > A[i])       // Has water on the bar
                volume += maxHeights[i] - A[i];     // Accumulate the volume of the water
        }
 
        return volume;
    }
Code from http://yucoding.blogspot.com/2013/05/leetcode-question-111-trapping-rain.html
int trap(int A[], int n) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if (n<2){return 0;}   
         
        int *l = new int[n];
        int *r = new int[n];
         
        int water =0;
         
        l[0]=0;
        for (int i=1;i<n;i++){
            l[i]= max(l[i-1], A[i-1]);
        }
                 
        r[n-1] = 0;
        for (int i=n-2;i>=0;i--){
            r[i]=max(r[i+1],A[i+1]);
        }
         
        for (int i=0;i<n;i++){
            if (min(l[i],r[i])-A[i] >0 ){
                water += min(l[i],r[i])-A[i];
            }
        }
         
        return water;
         
    }
Code from https://coderwall.com/p/outcbg
先计算柱状图的凸包面积,然后减去柱状图本身的面积,就是所能存储水的多少。时间复杂度:O(n),空间复杂度:O(1)。
int trap(int A[], int n) { // Start typing your C/C++ solution below // DO NOT write int main() function if(n<=2) return 0; int sum=A[0],mi=0; for(int i=1;i<n;i++) { sum+=A[i]; if(A[i]>A[mi]) mi=i; } int left=0,right=0,min=0; for(int i=1;i<=mi;i++) if(A[i]>=A[min]) { left+=A[min]*(i-min); min=i; } min=n-1; for(int j=n-2;j>=mi;j--) if(A[j]>=A[min]) { right+=A[min]*(min-j); min=j; } return left+right+A[mi]-sum; }
Read full article from LeetCode - Trapping Rain Water | Darren's Blog

No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts