[leetcode][042] Trapping Rain Water (Java)
我在Github上新建了一个解答Leetcode问题的Project, 大家可以参考, 目前是Java 为主,里面有leetcode上的题目,解答,还有一些基本的单元测试,方便大家起步。
题目在这里: https://leetcode.com/problems/trapping-rain-water/
[标签] Array; Stack; Two Pointers

这个题我感觉很难,我自己是完全不会。下面贴的是别人想到的好方法,自己适当做了些简单调整。
我觉得,这个解法非常巧妙的使用了双向的 two pointers。用到的变量有左右两个指针,一个在最左边,一个在最右边,然后两个一起往中间走。在走的时候维护两个变量,left barrier 和 right barrier,即左边的挡板和右边的挡板。
用例子说明一下思路:
用leftBarrier 和 rightBarrier围成一个”盆地“。如果是leftBarrier的高度低于rightBarrier(如下图),那么固定右边一侧,尝试移动left指针,这时我们比较leftBarrier和height[left],如果是height[left]较小的话,我们知道leftBarrier 和 left之间的部分一定是可以积攒下雨水的,(图中红色标注的部分);如果是height[left]较大的话,那就更新leftBarrier。
为什么上面是固定右边一侧的rightBarrier呢?因为当rightBarrier > leftBarrier的时候,如果再遇到height[left] < leftBarrier的情形的话,那么leftBarrier 和 height[left] 之间形成的区域是可以积攒雨水的。
啊,说的好像很绕,但是道理就是这么个道理……看看如果以后有更好的解释方法再来更新吧……汗

public class Solution {
public int trap(int[] height) {
int left = 0;
int right = height.length - 1;
int leftBarrier = 0;
int rightBarrier = 0;
int result = 0;
while (left <= right) {
if (leftBarrier <= rightBarrier) {
// there could be a basin between leftBarrier and rightBarrier
// and left side is lower one
if (height[left] > leftBarrier) {
// update left barrier
leftBarrier = height[left];
} else {
// trap water (leftBarrier - height[left]) * 1
result += leftBarrier - height[left];
}
left++;
} else {
if (height[right] > rightBarrier) {
// update right barrier
rightBarrier = height[right];
} else {
// trap water (rightBarrier - height[right]) * 1
result += rightBarrier - height[right];
}
right--;
}
}
return result;
}
}
[leetcode][042] Trapping Rain Water (Java)的更多相关文章
- LeetCode 042 Trapping Rain Water
题目要求:Trapping Rain Water Given n non-negative integers representing an elevation map where the width ...
- Java for LeetCode 042 Trapping Rain Water
Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...
- [LeetCode] 407. Trapping Rain Water II 收集雨水 II
Given an m x n matrix of positive integers representing the height of each unit cell in a 2D elevati ...
- leetcode#42 Trapping rain water的五种解法详解
leetcode#42 Trapping rain water 这道题十分有意思,可以用很多方法做出来,每种方法的思想都值得让人细细体会. 42. Trapping Rain WaterGiven n ...
- [array] leetcode - 42. Trapping Rain Water - Hard
leetcode - 42. Trapping Rain Water - Hard descrition Given n non-negative integers representing an e ...
- LeetCode 42. Trapping Rain Water 【两种解法】(python排序遍历,C++ STL map存索引,时间复杂度O(nlogn))
LeetCode 42. Trapping Rain Water Python解法 解题思路: 本思路需找到最高点左右遍历,时间复杂度O(nlogn),以下为向左遍历的过程. 将每一个点的高度和索引存 ...
- [LeetCode] 42. Trapping Rain Water 收集雨水
Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...
- [LeetCode] 407. Trapping Rain Water II 收集雨水之二
Given an m x n matrix of positive integers representing the height of each unit cell in a 2D elevati ...
- LeetCode - 42. Trapping Rain Water
42. Trapping Rain Water Problem's Link ------------------------------------------------------------- ...
随机推荐
- Poweroff – 很好很强大的定制关机工具
Poweroff – 很好很强大的定制关机工具 Poweroff 是一个用来管理电脑关机系统的小工具,支持定时,支持远程 作者开放源代码,有兴趣的同学可以尝试着制作一下汉化版本. 可以设定不同时间 ...
- bat转向指定的目录路径处
使用bat命令转到指定的盘符路径: cd /d xxxx目录路径. 例如:cd /d D:\abc\efg 则是转到D盘的abc目录下的efg目录处.其中 /d 是指:无论当前bat是在哪个盘符中,都 ...
- 使用C#版本GDAL读取复数图像
GDAL的C#版本虽然在很多算法接口没有导出,但是在读写数据中的接口基本上都是完全导出了.使用ReadRaster和WriteRaster方法来进行读写,同时对这两个方法进行了重载,对于常用的数据类型 ...
- 关于latex的使用随笔
1.the context after paragraph topic to new line /paragraph{xxxx}~{} 2.关于表格中文本过长自动换行问题的解决 P.S.:直接贴一段写 ...
- yield 生成器例子
#!/usr/bin/env python #encoding: utf-8 import time def consumer(name): print ('%s 来吃包子了...' % (name) ...
- android ConnectivityManager 检查是否有网络
一. ConnectivityManager 概要 ConnectivityManager是网络连接相关的管理器,它主要用于查询网络状态并在网络发生改变时发出状态变化通知.这个类主要负责的下列四个 ...
- JQuery的$和其它JS发生冲突的快速解决方法
众所周知,jQuery是目前最流行的JS封装包,简化了很多复杂的JS程序,JQuery讲浏览器DOM树定义为$,通过$来获取各个子节点. 然后,JS插件并非只有JQuery,还有prototype.j ...
- Hdu 1059 Dividing & Zoj 1149 & poj 1014 Dividing(多重背包)
多重背包模板- #include <stdio.h> #include <string.h> int a[7]; int f[100005]; int v, k; void Z ...
- perl 安装AnyEvent::HTTP
perl 版本 ActivePerl_5.16.2.msi
- BZOJ3394: [Usaco2009 Jan]Best Spot 最佳牧场
3394: [Usaco2009 Jan]Best Spot 最佳牧场 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 11 Solved: 9[Sub ...