演算法13 接雨水方法,一排凹槽可以裝多少雨水

2021-10-07 11:16:36 字數 1676 閱讀 9858

//「接雨水」演算法:

//vnums中數字代表一系列相鄰併排的水槽

//如索引號為"0"和"1"的數字0和1代表這一水槽只有右邊,即該水槽無法接到雨水

//而索引號從"1"到"3"的水槽可以接到1個單位的水量...

//求解思路:"滑動視窗","乙個"水槽"乙個"水槽的處理,此處的"乙個"代表的是乙個大的可以儲存水的「凹」處水槽

//水槽柱高

vectorvnums;

//nrainall儲存水槽可以儲存的所有水量

//nindex計算第乙個高度非"0"的水槽

int nrainall = 0, nindex = 0;

//找到第乙個可以裝水的水槽

while (0 == vnums[nindex])

//nonestart記錄當前水槽槽邊開始索引號

//none記錄滑動視窗當前槽邊索引位置

//nonemiddle記錄水槽底處,即水槽的"中間"位置,該位置的左邊水槽邊的高度下降,

//該位置的右端,水槽邊的高度上公升。

//noneend記錄的是最右端水槽邊的索引號。

int nonestart = 0, none = 0, nonemiddle = 0, noneend = 0;

//演算法開始

//從第乙個非0,即有邊的水槽開始"滑動視窗",尋找每乙個可以盛水的水槽

for (int i = nindex; i < vnums.size(); i++)

//這裡代表的就是找到槽底後跳出來的是因為當前索引"nnext"大於大於其前乙個槽邊高度,

//即槽邊高度開始"上公升",所以求槽底的索引號時需要減去1,做減減運算

nnext--;

//這裡判斷我們找到的槽底的索引值是否與水槽左端的索引值相同,如果相同,則意味著

//該水槽槽底與槽邊高度相同,顯然無法注水,因此用continue跳出該水槽的運算,

//直接進行下乙個水槽的盛水運算;反之,如果不同,說明當前水槽可以盛水(至少目前來看可以,因為

//水槽還得判斷水槽右邊是否滿足槽邊高於槽底的要求),此時我們需要更新槽底索引號nonemiddle為nnext

if (nnext != nonemiddle)

else

//這裡表示開始判斷水槽右端的高度是否滿足水槽邊高度高於槽底的盛水要求

//同樣,水槽右端需要向右滑動1個單位的視窗

if (nonemiddle + 1 < vnums.size())

//到這裡就表示尋找到槽邊高度開始下降了或者是水槽邊被探索完,仍然沒有找到開始下降的水槽邊

nnext--;

//判斷找到的右端是否與槽底索引號相同,相同的話表示該水槽只有左邊部分(類似乙個木桶只有一半,肯定無法注水)

//反之,若右端索引號與槽底索引號不同,則表示該水槽完整,有左右邊,有底(是乙個完整的水槽)。

if (noneend != nnext)

else}}

else

else}}

//這裡表示將當前水槽裝的水的體積儲存到總水量中

nrainall += (nrain - nsegsum);

//更新視窗索引值i

演算法(一)排序

一 o n 2 的排序演算法 1.選擇排序 selection sort 先找到最小的 public static void selectsort int arr 2.氣泡排序 bubble sort 先找到最大的 public static void bubblesort int arr 3.插入...

演算法(一) 排序sorting

問題 輸入數字a1,a2,a3.an,使其公升序輸出。1 插入排序 insertion sort 演算法 這個演算法從陣列的第二個元素開始迴圈,將選中的元素與之前的元素一一比較,如果選中的元素小於之前的元素,則將之前的元素後移,最後再將選中的元素放在合適的位置。在這個演算法執行的過程中,總是保持著索...

java演算法(一) 排序演算法(上)

排序 sort 是將一組資料按照一定的規則來進行排列,一般按照遞增或者遞減的順序來進行排列。排序演算法是一種最基本的演算法,但是在實際應用中非常廣泛,對於初學程式設計人來說,排序演算法也是最基本的演算法之一。本節主要講解排序演算法中相對簡單的幾種,分別是 1 氣泡排序 2 選擇排序 3 插入排序 後...