zoukankan      html  css  js  c++  java
  • [LeetCode] Trapping Rain Water

    Note: The following idea is in fact from the last answer in this link, which leads to a clean code. I just reorganize it and add some explanations. I hope it is Ok.

    The following are four solutions in C/C++/Java/Python respectively. The basic idea is that we set two pointers l and r to the left and right end of height. Then we get the minimum height (minHeight) of these pointers (similar to Container with Most Water due to the Leaking Bucket Effect) since the level of the water cannot be higher than it. Then we move the two pointers towards the center. If the coming level is less than minHeight, then it will hold some water. Fill the water until we meet some "barrier" (with height larger than minHeight) and update l and r to repeat this process in a new interval.


    C

     1 int trap(int* height, int heightSize) {
     2     int l = 0, r = heightSize - 1, water = 0, minHeight = 0;
     3     while (l < r) { 
     4         while (l < r && height[l] <= minHeight)
     5             water += minHeight - height[l++];
     6         while (r > l && height[r] <= minHeight)
     7             water += minHeight - height[r--];
     8         minHeight = height[l] <= height[r] ? height[l] : height[r];
     9     }
    10     return water;
    11 }

    C++

     1 class Solution {
     2 public:
     3     int trap(vector<int>& height) {
     4         int n = height.size(), l = 0, r = n - 1, water = 0, minHeight = 0;
     5         while (l < r) {
     6             while (l < r && height[l] <= minHeight)
     7                 water += minHeight - height[l++];
     8             while (r > l && height[r] <= minHeight) 
     9                 water += minHeight - height[r--];
    10             minHeight = min(height[l], height[r]);
    11         }
    12         return water;
    13     }
    14 };

    Java

    public class Solution {
        public int trap(int[] height) {
            int n = height.length, l = 0, r = n - 1, water = 0, minHeight = 0;
            while (l < r) {
                while (l < r && height[l] <= minHeight)
                    water += minHeight - height[l++];
                while (r > l && height[r] <= minHeight)
                    water += minHeight - height[r--];
                minHeight = Math.min(height[l], height[r]);
            }
            return water;
        }
    }

    Python

     1 class Solution:
     2     # @param {integer[]} height
     3     # @return {integer} 
     4     def trap(self, height):
     5         n = len(height)
     6         l, r, water, minHeight = 0, n - 1, 0, 0
     7         while l < r:
     8             while l < r and height[l] <= minHeight:
     9                 water += minHeight - height[l]
    10                 l += 1
    11             while r > l and height[r] <= minHeight:
    12                 water += minHeight - height[r]
    13                 r -= 1
    14             minHeight = min(height[l], height[r])
    15         return water
  • 相关阅读:
    Flink实例(四十七):状态管理(十一)自定义操作符状态(五)广播状态(Broadcast state)(三)
    Flink实例(四十六): Operators(七)多流转换算子(二)CONNECT, COMAP和COFLATMAP
    python题库
    python---replace函数
    算法图解--读书笔记
    python里的StringIO
    python通过sha1和base64生成签名
    python调用接口方式
    智能停车场车牌识别系统【python】
    leetcode 查找算法(三)
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4646980.html
Copyright © 2011-2022 走看看