42.接雨水

题目:

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例 1:

42.接雨水_第1张图片

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 

示例 2:

输入:height = [4,2,0,3,2,5]
输出:9

提示:

  • n == height.length
  • 1 <= n <= 2 * 104
  • 0 <= height[i] <= 105

解题思路:

将木桶分成两种情况处理,从做寻找到最高的木板,如果碰到右侧的木板比当前的木板高,就把中间的体积输出出来,让left指针指向当前的i。直到出现右侧不再有更高的木板就认为找到最高的木板了,同理将右侧的体积输出出来即可

代码:

class Solution:
    def trap(self, height) -> int:
        # 采用双指针的思想,判断left的值是否是木桶两侧最小的,如果是最小的就计算当前这个桶的体积
        length = len(height)
        left = 0
        right = length-1
        iner = 0
        last_left=-1
        while left!=last_left:
            last_left = left
            for i in range(left+1, length):
                if height[i]>=height[left]:
                    # 将中间的体积输出
                    iner+=(i-left-1)*height[left]
                    for j in range(left+1, i):
                        iner-=height[j]
                    left = i
            
        while right!=last_left:
            for i in range(right-1, last_left-1, -1):
                if height[i]>=height[right]:
                    # 将中间的体积输出
                    iner+=(right-i-1)*height[right]
                    for j in range(i+1, right):
                        iner-=height[j]
                    right = i
        return iner

你可能感兴趣的:(LeetCode-热题100,LeetCode-双指针,算法)