[LeetCode] Trapping Rain Water

本文详细介绍了四种编程语言(C/C++/Java/Python)实现利用水桶原理计算最大水桶容量的方法。通过设置两个指针从桶两端开始移动,计算每次遇到较低高度时可以存蓄的水量,并更新最大容量。代码简洁高效,适合初学者理解和实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

转载于:https://www.cnblogs.com/jcliBlogger/p/4646980.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值