LintCode:接雨水

LintCode:接雨水

做法一:扫两遍。 对某个值A[i]来说,能trapped的最多的water取决于在i之前左边的最高值和在i右边的最高的值,然后取当中较小的一个。 所以可以根据上面的分析先从左到右扫一遍得到数组LeftMostHeight,然后再从右到左计算RightMostHeight,这样只扫了两遍可以得到答案,时间复杂度是O(n),空间复杂度是O(n)。

class Solution:
    # @param heights: a list of integers
    # @return: a integer
    def trapRainWater(self, heights):
        # write your code here
        if len(heights) == 0:
            return 0
        n = len(heights)
        sum_water = 0
        max_nums_left = [0 for i in range(n+1)]
        max_nums_left[0] = heights[0]
        for i in range(1, n):
            max_nums_left[i] = max(heights[i], max_nums_left[i-1])
        max_nums_right = [0 for i in range(n+1)]
        max_nums_right[n - 1] = heights[n-1]
        m = n - 2
        while m >= 0:
            max_nums_right[m] = max(heights[m], max_nums_right[m+1])
            m -= 1
        for i in range(1, n):
            m = min(max_nums_left[i-1], max_nums_right[i+1])
            if m - heights[i] > 0:
                sum_water += m - heights[i]
        return sum_water

做法二:两个指针扫一遍, 这道题其实是一道两个指针的题目,而且指针属性是对撞型指针。 所以用两个指针分别指向数组的头和数组尾。 然后每次比较两个指针所指向的值,选小值指针向中间移动,并且每次更新遍历LeftMostHeight或者RightMostHeight, 这样就可以算出每个点的可以接的雨水数目。 这种方法的时间复杂度是O(n)。空间复杂度是O(1)。

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