容器盛水問題

2021-10-22 14:20:54 字數 1724 閱讀 5209

給定乙個直方圖(也稱柱狀圖),假設有人從上面源源不斷地倒水,最後直方圖能存多少水量?直方圖的寬度為 1。

上面是由陣列 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的直方圖,在這種情況下,可以接 6 個單位的水(藍色部分表示水)。 感謝 marcos 貢獻此圖。

示例:

輸入: [0,1,0,2,1,0,1,3,2,1,2,1]

輸出: 6

給定乙個整形陣列arr,已知其中所有的值都是非負的,將這個陣列看作乙個容器,請返回容器能裝多少水。

class solution 

int left=0, right=height.length-1;

int mark = math.min(height[left], height[right]);

int maxwater = 0;

while (left雙指標,分別指向左右邊界,記錄較小的邊界為mark,即短板;

從短板邊界像裡移動指標,當新指標值小於及矮於邊界,意味著可存水,疊加差值,如果新指標值大於短板邊界,意味著不能存水,同時更新短板值;

每次從短板邊界向里移動迭代即可;

給你 n 個非負整數 a1,a2,...,an,每個數代表座標中的乙個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0) 。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。

說明:你不能傾斜容器。

示例 1:

輸入:[1,8,6,2,5,4,8,3,7]

輸出:49

解釋:圖中垂直線代表輸入陣列 [1,8,6,2,5,4,8,3,7]。在此情況下,容器能夠容納水(表示為藍色部分)的最大值為 49。

示例 2:

輸入:height = [1,1]

輸出:1

示例 3:

輸入:height = [4,3,2,1,4]

輸出:16

示例 4:

輸入:height = [1,2,1]

輸出:2

n = height.length

2 <= n <= 3 * 104

0 <= height[i] <= 3 * 104

class solution 

int left=0, right=height.length-1;

int maxwater = 0;

while (left注意和題一的不同,這裡是在給定的陣列中任意找兩個板,看哪兩個板中間存的水最多;

雙指標指向左右邊界,找到短板邊界,此時左右邊界兩個板可存的水為min(left,right)*(right-left),即短板高度*兩板距離;

每次從短板那邊開始往裡靠,從新計算短板和存水量,並更新最大存水量

為什麼從短板往裡靠,因為對於該短板,右邊界已經是其能存的最大水量了,從用往裡靠,距離變短了,所以該短板已經發揮萬他的最大作用,可以丟棄了;

容器盛水問題

先是說一說對這道題的理解吧,常規的容器的容量是由最短的邊決定的,所以應該取左右兩邊的最短邊減去底高就是容量,所以理想狀態是將陣列遍歷一次,知道每乙個低是否有容量,例如l與r是容器的兩邊,且l比r小,故l決定了容量,設x為容器底,則l x,會出現兩種情況,一是整數,則可以知道容量是多少 二是負數,即這...

盛最多水的容器

給定 n 個非負整數 a1,a2,an,每個數代表座標中的乙個點 i,ai 畫 n 條垂直線,使得垂直線 i 的兩個端點分別為 i,ai 和 i,0 找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。注意 你不能傾斜容器,n 至少是2。乍一看很簡單,巢狀迴圈遍歷就完事了 int m...

盛最多水的容器

題目描述 給定 n 個非負整數 a1,a2,an,每個數代表座標中的乙個點 i,ai 在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 i,ai 和 i,0 找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水 說明 你不能傾斜容器,且 n 的值至少為 2。示例 輸入 1,8,6...