[LeetCode] 42. Trapping Rain Water
2016-07-21 08:57
309 查看
思路:
借鉴此处思路https://discuss.leetcode.com/topic/5125/sharing-my-simple-c-code-o-n-time-o-1-space/34.
用左右两个指针向中间靠拢进行跟踪, 拿左边先举例, 如果当前left的bar高度小于等于right指向的bar, 那么left和right之间至少能保证在left的高度上盛上水, 所以咱们就将就着left进行跟踪, 如果找到了高度更高的bar就更新maxleft, 如果遇到比maxleft低的left, 就把他们的差值存放到结果当中去. 如果当前left的bar高度大于right的bar, 那就动right指针, 其余思路一样. 关键点就在于我们要保证maxleft/right - left/right这些水也能被right/left的bar给挡住才行.
借鉴此处思路https://discuss.leetcode.com/topic/5125/sharing-my-simple-c-code-o-n-time-o-1-space/34.
用左右两个指针向中间靠拢进行跟踪, 拿左边先举例, 如果当前left的bar高度小于等于right指向的bar, 那么left和right之间至少能保证在left的高度上盛上水, 所以咱们就将就着left进行跟踪, 如果找到了高度更高的bar就更新maxleft, 如果遇到比maxleft低的left, 就把他们的差值存放到结果当中去. 如果当前left的bar高度大于right的bar, 那就动right指针, 其余思路一样. 关键点就在于我们要保证maxleft/right - left/right这些水也能被right/left的bar给挡住才行.
int trap(vector<int>& heights) { int res = 0; int left = 0, right = heights.size() - 1; int maxleft = 0, maxright = 0; while (left <= right) { if (heights[left] <= heights[right]) { if (maxleft <= heights[left]) maxleft = heights[left]; else res += maxleft - heights[left]; left++; } else { if (maxright <= heights[right]) maxright = heights[right]; else res += maxright - heights[right]; right--; } } return res; }
相关文章推荐
- 关于指针的一些事情
- C# Pointer指针应用实例简述
- C和指针小结(推荐)
- C++智能指针实例详解
- 浅谈C++指针(必看)
- C++指向函数的指针实例解析
- 关于c语言指针的两处小tip分享
- 浅谈c/c++中使用指针需要注意的问题
- 浅析iterator与指针的区别
- 探讨C++中数组名与指针的用法比较分析
- C++编程指向成员的指针以及this指针的基本使用指南
- 详解C++中的指针、数组指针与函数指针
- C++中字符串以及数组和指针的互相使用讲解
- C语言安全之数组长度与指针实例解析
- C++中指向对象的常指针与指向常对象的指针详解
- 指向变量的常指针与指向常变量的指针详细解析
- C#通过指针实现快速拷贝的方法
- 深入理解c++指针的指针和指针的引用
- php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
- C#通过指针读取文件的方法