Trapping Rain Water
来源:互联网 发布:mac文档怎么保存 编辑:程序博客网 时间:2024/06/03 21:36
leetcode第42题,这个题解法非常多,典型的就是栈法和双指针法,除此之外还有不少奇奇怪怪的方法,在此只记录三种。
第一种,栈方法,基本思路是,遍历整个高度数组,遇到比之前一项小的元素就压入栈,遇到比前一个元素大的元素则开始检查栈,如果该元素比栈顶元素小,说明可以存水,则弹出栈顶,同时计算存水的量。此时栈中原来的第二个元素成为栈顶元素,继续与该元素比较,直至栈空或者栈顶元素大于该元素,这说明无法存水,就停止检查栈,转而继续遍历数组。
计算存水量的方法是,比较弹出的栈顶元素与前后两个元素之间的差值,这两个差值的最小值就是存水量。
这里有三个检查栈空的操作,第一个是最外层的for循环,主要是为了压入首个元素。第二个第三个主要是做边界的检查。
这里使用了python的列表模拟了栈。
class Solution(object): def trap(self, height): """ :type height: List[int] :rtype: int """ n = len(height) ans = 0 stack = [] for i in range(0,n): if len(stack) == 0 or height[i] < height[stack[-1]] : stack.append(i) else: while(len(stack) != 0 and height[stack[-1]] < height[i]): pre = stack[-1] del stack[-1] if len(stack) != 0: ans += min(height[i]-height[pre],height[stack[-1]]-height[pre])*(i-stack[-1]-1) stack.append(i) return ans
第二种方法是双指针,主要思路是从两边向中间遍历,其实这个问题就是一个找出挡板的问题,先从两边向中间找出边界的峰值,作为最边缘的挡板,然后不断地比较左右元素与峰值最小值的差,这就是该元素的存水量,加上去就可以了,一旦出现了有元素大于了峰值,则更新峰值,其实就是更换了挡板。
class Solution {public: int trap(vector<int>& height) { int n = height.size(); int left = 0; int right = n-1; int sum = 0; while(left < right && height[left+1] > height[left]) left++; while(left < right && height[right-1] > height[right]) right--; while(left < right) { int rightmost = height[right]; int leftmost = height[left]; if (leftmost < rightmost) { while(left < right && height[++left] < leftmost) sum += leftmost-height[left]; } else { while(left < right && height[--right] < rightmost) sum += rightmost-height[right]; } } return sum; }};
还有一种方法比较好理解,每个位置上的存水量都是由它左右两边的峰值的最小值决定的,因此可以先遍历数组,求出每个位置上的左右峰值先行储存起来,然后就可以额计算每个位置上的存水量了。
0 0
- LeetCode: Trapping Rain Water
- LeetCode : Trapping Rain Water
- Trapping Rain Water
- [LeetCode] Trapping Rain Water
- [Leetcode] Trapping Rain Water
- [Leetcode] Trapping Rain Water
- Trapping Rain Water
- Trapping Rain Water
- [LeetCode]Trapping Rain Water
- Trapping Rain Water
- Trapping Rain Water
- LeetCode-Trapping Rain Water
- Trapping Rain Water
- [leetcode] Trapping Rain Water
- Trapping Rain Water
- [LeetCode] Trapping rain water
- Leetcode: Trapping Rain Water
- 38 - Trapping Rain Water
- JNI学习积累之二 ---- 数据类型映射、域描述符说明
- ERROR 1267 (HY000): Illegal mix of collations (utf8_general_ci,IMPLICIT) and (gbk_chinese_ci,COERCIB
- 通过pwnable.kr从零学pwn
- Windows 下 MySQL 简单定时自动备份、删除过期备份
- Vim命令合集
- Trapping Rain Water
- MFC中网络编程,利用套接字的过程。
- 两个Java项目之间的通信
- Python小记05
- Memcache安全配置
- 数据库检索 索引之--- B 树
- Activity的四种启动模式
- WebService 的工作原理
- Java实现拖拽上传(未测试)