Leetcode 42. Trapping Rain Water

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

For example,
Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.

思路:显然index = 0 and size - 1 这两个位置不会存水。只需要考察这中间的位置。如果一个位置 index (e.g. 2), 左边和右边都有比它大的数,index上面才可能有水。写一个subroutine来找左(右)边第一个高于index的位置,并记录下这个高度为 LH, RH。存水会使LHI, RHI之间的所有位置高度都变成min(RH, LH)。然后我们跳到 RHI这个位置接着再找就可以。

 1 class Solution(object):
 2     def trap(self, height):
 3         """
 4         :type height: List[int]
 5         :rtype: int
 6         """
 7         size = len(height)
 8         S1 = sum(height)
 9         if size <= 2:
10             return 0
11         i = 1
12         while i <= size -1:
13             [RHI, RH] = self.firstHigher(height, i, True)
14             [LHI, LH] = self.firstHigher(height, i,False)
15             if RHI>i and RHI > LHI+1:
16                 for k in range(LHI+1, RHI):
17                     height[k] = min(RH, LH)
18                 i = RHI
19             else:
20                 i += 1
21             
22         return sum(height) - S1
23              
24     def firstHigher(self, height, index, right):
25         size = len(height)
26         if right == True:
27             for j in range(index+1,size):
28                 if height[j] > height[index]:
29                     return [j, height[j]]
30                 else:
31                     continue
32         else:
33             for j in range(index-1, -1, -1):
34                 if height[j] > height[index]:
35                     return [j, height[j]]
36                 else:
37                     continue
38         return [index, height[index]]
39     
40             

 

posted @ 2017-02-28 11:05  lettuan  阅读(127)  评论(0编辑  收藏  举报