给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排 列的柱子,下雨之后能接多少雨水c语言
时间: 2024-05-13 08:19:14 浏览: 46
以下是C语言实现,使用了双指针法:
```c
int trap(int* height, int heightSize){
int left = 0, right = heightSize - 1; // 左右指针
int left_max = 0, right_max = 0; // 左右最大高度
int res = 0; // 雨水量
while (left < right) {
if (height[left] < height[right]) { // 若左边的柱子更矮
if (height[left] >= left_max) left_max = height[left]; // 更新左边最大高度
else res += left_max - height[left]; // 累加雨水量
left++; // 左指针右移
} else { // 若右边的柱子更矮
if (height[right] >= right_max) right_max = height[right]; // 更新右边最大高度
else res += right_max - height[right]; // 累加雨水量
right--; // 右指针左移
}
}
return res;
}
```
时间复杂度为O(n),空间复杂度为O(1)。
相关问题
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。写出代码
在计算机编程中,这个问题通常被称为“最上面一滴水”的问题,或者更正式地说,“滑动窗口的最大值”。给定一个数组,你需要找到每个位置上可以接收到的最大雨水量,这可以通过动态规划或者双指针技巧解决。
这里是一个使用Python的解决方案:
```python
def trap(height):
if not height:
return 0
left = 0
right = len(height) - 1
max_left = 0
max_right = 0
water = 0
while left < right:
if height[left] < height[right]:
if height[left] > max_left:
max_left = height[left]
else:
water += max_left - height[left]
left += 1
else:
if height[right] > max_right:
max_right = height[right]
else:
water += max_right - height[right]
right -= 1
return water
```
这个函数通过维护两个变量`max_left`和`max_right`分别记录左右边界处当前高度最高的柱子,然后计算当前能够接收到的雨水量。每次遍历,如果左边的柱子更高,则更新左侧的水位,反之则更新右侧。最后返回所有雨水的总和。
使用python,给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
使用python编写代码,可以通过给定一个长度为n的非负整数数组,表示n个柱子的高度,来计算下雨后最多能接多少雨水。
代码实现步骤如下:
1. 定义一个长度为n的数组,用于存储每个柱子的高度。
2. 从左到右遍历数组,并找到当前柱子左边的最高柱子和右边的最高柱子。
3. 计算当前柱子的储水量,即为两边最高柱子的最小值减去当前柱子的高度。
4. 将每个柱子的储水量加起来,就是总的储水量。
代码示例:
```
class Solution:
def trap(self, height: List[int]) -> int:
n = len(height)
left = [0] * n
right = [0] * n
left_max = 0
right_max = 0
for i in range(n):
left[i] = left_max
left_max = max(left_max, height[i])
for i in range(n - 1, -1, -1):
right[i] = right_max
right_max = max(right_max, height[i])
result = 0
for i in range(n):
if min(left[i], right[i]) > height[i]:
result += min(left[i], right[i]) - height[i]
return result
```
这样,就可以通过给定的非负整数数组,计算出雨水的最大储存量。
阅读全文