java wate_Trapping Rain Water leetcode java
題目:
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!
題解:
參考:低調(diào)小一(http://blog.csdn.net/wzy_1988/article/details/17752809)的解題思路
“首先,碰到這樣的題目不要慌張,挨個(gè)分析每個(gè)A[i]能trapped water的容量,然后將所有的A[i]的trapped water容量相加即可
其次,對(duì)于每個(gè)A[i]能trapped
water的容量,取決于A[i]左右兩邊的高度(可延展)較小值與A[i]的差值,即volume[i] = [min(left[i],
right[i]) - A[i]] * 1,這里的1是寬度,如果the width of each bar is 2,那就要乘以2了”
那么如何求A[i]的左右高度呢? 要知道,能盛多少水主要看短板。那么對(duì)每個(gè)A[i]來說,要求一個(gè)最高的左短板,再求一個(gè)最高的右短板,這兩個(gè)直接最短的板子減去A[i]原有的值就是能成多少水了。
所以需要兩遍遍歷,一個(gè)從左到右,找最高的左短板;一個(gè)從右到左,找最高的右短板。最后記錄下盛水量的總值就是最終結(jié)果了。
代碼如下:
1??????public?int?trap(int[]?A)?{
2?????????if?(A?==?null?||?A.length?==?0)
3?????????????return?0;
4
5?????????int?i,?max,?total?=?0;
6?????????int?left[]?=?new?int[A.length];
7?????????int?right[]?=?new?int[A.length];
8
9?????????//from?left?to?right10?????????left[0]?=?A[0];
11?????????max?=?A[0];
12?????????for?(i?=?1;?i?
13?????????????left[i]?=?Math.max(max,?A[i]);
14?????????????max?=?Math.max(max,?A[i]);
15?????????}
16
17?????????//from?right?to?left18?????????right[A.length-1]?=?A[A.length-1];
19?????????max?=?A[A.length-1];
20?????????for?(i?=?A.length-2;?i?>=?0;?i--)?{
21?????????????right[i]?=?Math.max(max,?A[i]);
22?????????????max?=?Math.max(max,?A[i]);
23?????????}
24
25?????????//trapped?water?(when?i==0,?it?cannot?trapped?any?water)26?????????for?(i?=?1;?i?
27?????????????int?bit?=?Math.min(left[i],?right[i])?-?A[i];
28?????????????if?(bit?>?0)
29?????????????????total?+=?bit;
30?????????}
31
32?????????return?total;
33?????}
對(duì)照著代碼再看原來的例子:
index:? 0? 1? 2? 3? 4? 5? 6? 7? 8? 9? 10 11
A[index]:? 0? 1? 0? 2? 1? 0? 1? 3? 2? 1? 2? 1
left[index]: 0? 1? 1? 2? 2? 2? 2? 3? 3? 3? 3? 3
right[index]: 3? 3? 3? 3? 3? 3? 3? 3? 2? 2? 2? 1
min[i]: 0? 1? 1? 2? 2? 2? 2? 3? 2? 2? 2? 1
bit[i]: -? 0? 1? 0? 1? 2? 1? 0? 0? 1? 0? 0
那么根據(jù)上表可以算出最終結(jié)果是6。
Reference:http://blog.csdn.net/wzy_1988/article/details/17752809
總結(jié)
以上是生活随笔為你收集整理的java wate_Trapping Rain Water leetcode java的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魅族 21 手机开启 1 元超前订:36
- 下一篇: 微软必应聊天 nosearch 模式初体