SWUST派森练习题:P118. 数组接雨

描述

给定一个整形数组​​arr​​**,已知其中所有的值都是非负的,将这个数组看作一个柱子高度图,计算按此排列的柱子,下雨之后能接多少雨水。​(​数组以外的区域高度视为0)**

图片

数据范围:数组长度​​** 0≤n≤2×10^5^,数组中每个值满足​​ 0<val≤10^9^,保证返回结果满足 0≤val≤10^9^ **

样例

输入

3,1,2,5,2,4

输出

5

代码:

height = [int(x) for x in input().split(',')]
n = len(height)
left, right = 0, n - 1
left_max, right_max = height[0], height[n - 1]
summ = 0
while left <= right:
    left_max = max(left_max, height[left])
    right_max = max(right_max, height[right])
    if left_max < right_max:
        summ += left_max - height[left]
        left += 1
    else:
        summ += right_max - height[right]
        right -= 1
print(summ)

代码解析:

height = input().split(',')
height = [int(x) for x in height]
  • 这两行代码获取用户输入,并使用逗号分隔符将输入的字符串转换为一个字符串列表。
  • 然后,使用列表推导式将字符串列表中的每个元素转换为整数,并将结果存储在height列表中。
n = len(height)
left, right = 0, n - 1
left_max, right_max = height[0], height[n - 1]
summ = 0
  • 这部分代码初始化了变量n,表示输入列表height的长度。
  • 另外,定义了左指针(left)和右指针(right),并初始化为列表的第一个元素和最后一个元素的索引。
  • left_maxright_max分别表示左侧和右侧的最大高度,默认情况下分别设置为列表的第一个元素和最后一个元素的高度。
  • 最后,变量summ用于累计结果,初始化为0。
while left <= right:
    left_max = max(left_max, height[left])
    right_max = max(right_max, height[right])
    
    if left_max < right_max:
        summ += left_max - height[left]
        left += 1
    else:
        summ += right_max - height[right]
        right -= 1
  • 这部分是主要的计算逻辑,使用双指针法遍历列表中的元素。
  • 当左指针小于等于右指针时,执行循环。
  • 在每次循环中,通过比较左右指针对应位置的高度,更新左侧最大高度(left_max)和右侧最大高度(right_max)。
  • 如果左侧最大高度小于右侧最大高度,则计算并累加雨水量:left_max - height[left],并将左指针右移一位。
  • 否则,计算并累加雨水量:right_max - height[right],并将右指针左移一位。
print(summ)
  • 最后,打印累计的雨水量。

猜你喜欢

转载自blog.csdn.net/m0_63501513/article/details/132397590