[LeetCode]题解(python):042-Trapping Rain Water

题目来源:

  https://leetcode.com/problems/trapping-rain-water/


 

题意分析:

  输入一组数组,代表一个宽度为1的高度地图。问,这个地图在雨后可以收集多少水。例如,输入一个数组[0,1,0,2,1,0,1,3,2,1,2,1],返回的是6.如图所示:

[LeetCode]题解(python):042-Trapping Rain Water_第1张图片


 

题目思路:

  这道题目虽然说是hard难度的题目,但是其实不是很难。不难发现,水都是从最高那个数起和第二高数之间。那么这题可以分成两部。①找到数组的最大值。②计算最大值左边和右边分别可以收集多少水;计算左边的时候,首先找到左边最靠左的高度,计算它和最高数之间收集的水和第二高往左的和,形式化表示就是f(i) = w(i,j) + f(j),f(i)代表从i往左收集的水,w(i,j)代表i和j之间收集的水。w(i,j)和容易算,就是i到j之间第二高减去原来高度之和;右边计算类似。时间复杂度是(O(n))。


 

代码(python):

  

 1 class Solution(object):
 2     def left(self,height,i):
 3         if i == 0:
 4             return 0
 5         n = i - 1;mi = n;maxh = height[mi]
 6         while n >= 0:
 7             if height[n] >= maxh:
 8                 maxh = height[n];mi = n
 9             n -= 1
10         ans = 0;k = mi
11         while k < i:
12             ans += maxh - height[k]
13             k += 1
14         return ans + self.left(height,mi)
15     def right(self,height,i):
16         size = len(height)
17         if i == size - 1:
18             return 0
19         n = i + 1; mi = n;maxh = height[mi]
20         while n < size:
21             if height[n] >= maxh:
22                 maxh = height[n];mi = n
23             n += 1
24         ans = 0;k = mi
25         while k > i:
26             ans += maxh - height[k];k -=1
27         return ans + self.right(height,mi)
28     def trap(self, height):
29         """
30         :type height: List[int]
31         :rtype: int
32         """
33         s = len(height)
34         if s == 0:
35             return 0
36         mh = height[0];m = 0; i = 1
37         while i < s:
38             if height[i] >= mh:
39                 mh = height[i];m = i
40             i += 1
41         return self.left(height,m) + self.right(height,m)
42         
View Code

 


 

转载请注明出处:http://www.cnblogs.com/chruny/p/4934365.html

转载于:https://www.cnblogs.com/chruny/p/4934365.html

你可能感兴趣的:([LeetCode]题解(python):042-Trapping Rain Water)