Leetcode NO.42 Trapping Rain Water
2015-10-08 04:19
567 查看
本题题目要求如下:
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
The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!
总体来说,本题虽然难度是hard,但是不算太难,主要就是思维很难想到,但是知道思路后这题就相当简单。。。。。我最开始想了一种类似于求导的方法,不断找出各种波峰。。虽然不是one-pass,但是也不会求导太多次,最后花费1个多小时,也算做出来了,后来一看答案,才发现一种非常简单的方法:
设定两个指针,分辨从左右两边向中间遍历
确定两个指针较低的一个,如果这个比之前设定的水平线低,则不管,如果比之前的水平线高,则需更新水平线,并且水平线一下的的值需要加入到结果中
个人语言描述功力一般,不过这道题真的很好懂,直接看代码就好了,自己再拿图中例子实验一遍,就可以领会:
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.
The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!
总体来说,本题虽然难度是hard,但是不算太难,主要就是思维很难想到,但是知道思路后这题就相当简单。。。。。我最开始想了一种类似于求导的方法,不断找出各种波峰。。虽然不是one-pass,但是也不会求导太多次,最后花费1个多小时,也算做出来了,后来一看答案,才发现一种非常简单的方法:
设定两个指针,分辨从左右两边向中间遍历
确定两个指针较低的一个,如果这个比之前设定的水平线低,则不管,如果比之前的水平线高,则需更新水平线,并且水平线一下的的值需要加入到结果中
个人语言描述功力一般,不过这道题真的很好懂,直接看代码就好了,自己再拿图中例子实验一遍,就可以领会:
class Solution { public: int trap(vector<int>& height) { int sz = height.size(); int left = 0; int right = sz - 1; int cur_level = 0; int res = 0; while (left <= right) { int tmp_val = min(height[left], height[right]); if (tmp_val > cur_level) { res += (right - left + 1) * (tmp_val - cur_level); cur_level = tmp_val; } if (height[left] < height[right]) { res -= height[left++]; } else { res -= height[right--]; } } return res; } };
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C++联合体转换成C#结构的实现方法
- C#实现的算24点游戏算法实例分析
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析