換個方向可能更簡單---在力扣的成長(三)

算法解題地址:https://leetcode-cn.com/problems/trapping-rain-water/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-w-8/算法

這個是真的牛比,當看到這個解決方法時,我驚了,個人初始想法是經過柱子的變化趨勢去找到全部的凹槽,而後用Math.min(left,right)*(rx-lx-1)-(中間的圓柱的體積)獲得每一個凹槽裝水的體積,而後進行累加獲得盛水的整體積,這種思路真的是太直了,直得一點彎都不轉的,並且這種解法不適用於最後一個凹槽的狀況。多是看到題目的緣故把,讓我直接想算全部凹槽盛水的體積。這個大神將這個題目徹底轉化成了幾何問題,將整個分解成了每一行來算,將這個看起來極其複雜的問題轉化成了一個很簡單的問題,太厲害了。有的時候題目多是最能迷惑人的地方,將咱們的思路強行移動到一個方向,但這個方向可能很麻煩,若是說這個題目的問題是編程

求藍色區域的面積,咱們可能很想的簡單一些。因此說,不要老是停留在本身的世界裏面了,多去看看其餘人的想法可能會給你的編程帶來幫助,你的腦殼也會更加活躍一些吧。數組

如下是我的寫的代碼,若是有大佬幫忙給看一下,謝謝:app

      

package test;
/*
* 本程序的基本思想
* 經過柱子的變化趨勢分別肯定凹槽的左邊界和右邊界
*只遍歷一遍柱子高度
*該程序的過程
*判斷左邊界,左邊界肯定判斷右邊界,最後將按照Math.min(left,right)*(rx-lx)-(中間的圓柱的體積)計算處
*凹槽中盛水的體積
*/
public class RainWater {3d

public static void main(String[] args) {
//柱子的高度
int [] height=new int[]{0,1,0,2,1,0,1,3,2,1,2,1};
//左指針,用來記錄凹槽的左邊
int left=0;
//右指針,用來記錄凹槽的右邊
int right=0;
//遊標 做爲程序結束的條件
int cursor=1;
//柱子的個數,用來判斷遊標是否遍歷到數組最後
int size=height.length;
//凹槽裝水的整體積
int sum=0;
while(cursor<size) {
//一、判斷左邊界
if(height[left]<=height[cursor]) {
//a、沒有變化趨勢或者是上升趨勢,那麼這個柱子不能做爲左邊界,因此,將左邊界向右移動
left++;
//b、遊標向右移動
cursor++;
//c、進行下一次循環
continue;
}
else {
cursor++;
//a、說明有成爲左邊界的趨勢,若是中間小於左邊,直到找到一個>=左邊界的邊做爲右邊界,每一次while循環找到一
//b、凹槽,並計算面積
while(cursor<size&&height[left]>height[cursor]) {
cursor++;
}
//c、當while循環調處時,判斷是否由於遍歷到最後找不到致使循環跳出
if(cursor==size) {
break;
}
else {
//d、找到了右邊界,採用公式計算出當前凹槽的體積
right=cursor;
sum+=height[left]*(right-left-1)-getSum(0,left,right,height);
System.out.println("凹槽邊界["+left+","+right+"],體積爲"+(height[left]*(right-left-1)-getSum(0,left,right,height)));
//d、將左右邊界重置,遊標+1
left=right=cursor;
cursor++;
//e、尋找下一個凹槽,並計算凹槽體積
continue;
}
}

}
System.out.println("裝水的整體積爲"+sum);
}
public static int getSum(int sum,int left,int right,int [] height) {
// int sum=0;
for(int i=left+1;i<right;i++) {
sum+=height[i];
}
return sum;
}
}指針

相關文章
相關標籤/搜索