LintCode:接雨水
来源:互联网 发布:unicode转中文 java 编辑:程序博客网 时间:2024/04/28 07:52
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)。
0 0
- LintCode-接雨水
- LintCode:接雨水
- LintCode:接雨水
- 接雨水 lintcode
- lintcode[363]:接雨水
- LintCode:M-接雨水
- 接雨水-LintCode
- 接雨水 II-LintCode
- LintCode rain trap 接雨水
- [LintCode 363] 接雨水(Python)
- 雨水,lintcode
- **[Lintcode]Trapping Rain Water 接雨水
- lintcode刷题——接雨水
- 接雨水
- 接雨水
- 接雨水
- 接雨水问题(C++)
- 接雨水问题
- 新人java项目开发
- fatal error LNK1104: 无法打开文件“jvm.lib”
- spring web mvc配置
- Springmvc-MyBatis集成
- Android Studio SQLite数据库应用(一)
- LintCode:接雨水
- node.js 第一个程序
- 一个SQL语句分清楚RANK(),DENSE_RANK(),ROW_NUMBER()三个排序的不同
- windows8.1 同时安装python 2.x 和3.x方法
- Android动画完全解析--属性动画
- LightOJ1370
- hdu 3038 带权并查集
- php数组函数中的array_slice和array_flip
- Add Digits