Leetcode 42. 接雨水 - python - 递归 查找分水岭

https://leetcode-cn.com/probl...

题目概括

Leetcode 42. 接雨水 - python - 递归 查找分水岭_第1张图片

黑色的是柱子,蓝色的是水。
求最多能盛多少水。

解法

有很多解法,比如扫描数组,算出每个位置上到左边、右边的最高柱子的高度, O(n)时间复杂度

下面的解法是找分水岭,比如从左往右遍历,只要找到第一个高度大于最左侧的柱子的,它就是分水岭,这时候就能确定前面的水位。然后后面的和前面的就没关系了,递归执行这个算法。

到最后一段,可能没有更高的柱子了,找不到分水岭,但是可以直接把数组前后颠倒(reverse),再递归调用一次就可以了。

class Solution:
    def trap(self, height: List[int]) -> int:
        def solve(hs):
            #print('solve', hs)
            cnt = len(hs)
            if cnt < 3: return 0
            if cnt == 3:
                if hs[0] > hs[1] < hs[2]:
                    return min(hs[0],hs[2]) - hs[1]
                return 0
            for l in range(cnt):
                if hs[l] > 0: break
            hl = hs[l]
            cur = l + 1
            f = False
            v = 0
            #print('hl', hl, l)
            while cur < cnt:
                if hs[cur] < hl:
                    f = True
                else:
                    if f:
                        for i in range(cur-1, l, -1):
                            if hs[i] < hl:
                                v += hl - hs[i]
                    #print(hs[l:cur+1], v)
                    return solve(hs[cur:]) + v
                cur += 1
            hs.reverse()
            return solve(hs)
        return solve(height)

你可能感兴趣的:(python,leetcode)