容器裝水。最大裝水量

2021-08-16 08:37:00 字數 1245 閱讀 5649

給定乙個陣列代表乙個容器, 比如[3,1,2,4], 

代表0位置是乙個寬度為1,高度為3的直方圖。

代表1位置是乙個寬度為1,高度為1的直方圖。

代表2位置是乙個寬度為1,高度為2的直方圖。

代表3位置是乙個寬度為1,高度為4的直方圖。

所有直方圖的底部都在一條水平線上,且緊靠著。

把這個圖想象成乙個容器,這個容器可以裝3格的水。

給定乙個沒有負數的陣列arr,返回能裝幾格水?

分析,每個位置可以盛水的原理。

他們可以乘的水。就是左邊最高的牆和右邊最高的牆中 比較低的那個。 減去自己的高度

如果減後為負值。說明一點水都乘不了。↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

需要的資料是。每個位置。左邊所有陣列的最大值。右邊所有陣列的最大值。

使用預處理陣列,儲存結果

減少時間複雜度。計算總乘水量 時間複雜度o(n)

public static int getwater1(int arr)

int len = arr.length;

//意義: 0 位置左邊所有值中最大的。 1位值左邊所有值中最大的。..

int l = new int[len];

//意義: 0 位置右邊所有值中最大的。 1位值右邊所有值中最大的。...

int r = new int[len];

l[0] = arr[0];

for(int i=1;i=0;i--)

system.out.println(arrays.tostring(l));

system.out.println(arrays.tostring(r));

//利用原理和,需求資料求值

//最前和最後不可能盛水

int res = 0;

for(int i=1;i分析預處理陣列的值變化情況。和題意

最優解:

public static int getwater2(int arr)

int res = 0;

for(int l=0,r=arr.length-1;l+1<=r-1;)else

} return res;

}

Lintcode 裝最多水的容器

給定 n 個非負整數 a1,a2,an,每個數代表了座標中的乙個點 i,ai 畫 n 條垂直線,使得 i 垂直線的兩個端點分別為 i,ai 和 i,0 找到兩條線,使得其與 x 軸共同構成乙個容器,以容納最多水。注意事項 容器不可傾斜。您在真實的面試中是否遇到過這個題?yes 樣例給出 1,3,2 ...

裝最多水的容器 LintCode

給定 n 個非負整數 a1,a2,an,每個數代表了座標中的乙個點 i,ai 畫 n 條垂直線,使得 i 垂直線的兩個端點分別為 i,ai 和 i,0 找到兩條線,使得其與 x 軸共同構成乙個容器,以容納最多水。注意事項 容器不可傾斜。樣例 給出 1,3,2 最大的儲水面積是2.ifndef c38...

lintcode 383 裝最多水的容器

給定 n 個非負整數 a1,a2,an,每個數代表了座標中的乙個點 i,ai 畫 n 條垂直線,使得 i 垂直線的兩個端點分別為 i,ai 和 i,0 找到兩條線,使得其與 x 軸共同構成乙個容器,以容納最多水。注意事項 容器不可傾斜。樣例給出 1,3,2 最大的儲水面積是2.標籤兩根指標 陣列 思...