双指针算法实现接雨水

Python 使用双指针算法实现接雨水

接雨水是一道经典的算法问题,可以使用双指针算法来解决,双指针算法的思路是设置左右两个指针,分别从左右两边向中间移动,并计算当前位置能够接住多少雨水。

如下是一个使用双指针算法计算接雨水总量的 Python 示例代码:

def rain(height):
    left, right = 0, len(height) - 1
    # 左右两边的最大高度
    left_max, right_max = 0, 0
    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 += 1
        # 右边的高度小于左边的高度
        else:
            if height[right] >= right_max:
                right_max = height[right]
            else:
                res += right_max - height[right]
            right -= 1
    return res

# 测试代码
height = [0,1,5,3,7,1,9]
print(rain(height))

上述代码中定义了一个名为rain的函数,该函数接受一个表示不同位置高度的列表height作为参数,并返回可以接收的雨水总量。
在函数内部,首先定义了两个指针leftright,它们分别指向列表height的最左边和最右边,同时定义了两个变量left_maxright_max,用于记录左右两边的最大高度,接下来,使用一个循环来计算每个位置能够接收的雨水量。循环条件是left < right,即左指针小于右指针,在循环中进行以下操作:

  • 如果当前左边的高度height[left]小于右边的高度height[right]
    • 判断左边的高度是否大于等于左边的最大高度left_max,如果大于等于则更新left_max为当前左边的高度;
    • 如果小于left_max,将left_max与当前左边的高度之差累加到结果变量res中,表示可以接收的雨水量;
    • 接着,左指针向右移动一步,即left += 1
  • 如果当前右边的高度height[right]小于左边的高度height[left]
    • 判断右边的高度是否大于等于右边的最大高度right_max,如果大于等于则更新right_max为当前右边的高度;
    • 如果小于right_max,将right_max与当前右边的高度之差累加到结果变量res中;
    • 右指针向左移动一步,即right -= 1

循环结束后,函数返回结果变量res,即可以接收的雨水总量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值