题目来源:
https://leetcode.com/problems/trapping-rain-water/
题意分析:
输入一组数组,代表一个宽度为1的高度地图。问,这个地图在雨后可以收集多少水。例如,输入一个数组[0,1,0,2,1,0,1,3,2,1,2,1],返回的是6.如图所示:
题目思路:
这道题目虽然说是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
转载请注明出处:http://www.cnblogs.com/chruny/p/4934365.html
时间: 2024-11-05 21:35:29