盛水最多的容器
雙指針代表的是 可以作為容器邊界的所有位置的範圍。在一開始,雙指針指向數組的左右邊界,表示 數組中所有的位置都可以作為容器的邊界,因為我們還沒有進行過任何嘗試。在這之後,我們每次將 對應的數字較小的那個指針 往 另一個指針 的方向移動一個位置,就表示我們認為 這個指針不可能再作為容器的邊界了。
該題需要證明一個觀點
即如果當前的邊為兩個邊界的較大的一條邊,則無論怎麼移動改變,也不會使移動後的容量大於等於當前容量
假設x<=y 且 height[x]<=height[y],則容器內的容量最大為 height[x]*(y-x).
如果此時移動了y,由於 height[x]<=height[y] ,移動後的 height[y-1]有兩種情況,
- height[x]<=height[y-1] 此時容量為 height[x](y-1-x) < height[x](y-x)
- height[x]> height[y-1] 此時容量為 height[y-1](y-1-x), 又因為height[y-1]<height[x] ,y-1-x<y-x,所以最終的容量仍小於 height[x](y-x)
這種情況下,只有移動較小那一條邊才會有機會使得容量變大
這也叫短板效應
,即決定一個木桶最大容積的不是他的最長的板子,而是他最短的板子
//給你 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
//
// Related Topics 數組 雙指針
// 👍 2235 👎 0
//leetcode submit region begin(Prohibit modification and deletion)
/**
* 該題需要證明一個觀點
* 即如果當前的邊為兩個邊界的較大的一條邊,則無論怎麼移動改變,也不會使移動後的容量大於等於當前容量
* 假設x<=y 且 height[x]<=height[y],則容器內的容量最大為 height[x]*(y-x).
* 如果此時移動了y,由於 height[x]<=height[y] ,移動後的 height[y-1]有兩種情況,
* 1. height[x]<=height[y-1] 此時容量為 height[x]*(y-1-x) < height[x]*(y-x)
* 2. height[x]> height[y-1] 此時容量為 height[y-1]*(y-1-x), 又因為height[y-1]<height[x] ,y-1-x<y-x,所以最終的容量仍小於 height[x]*(y-x)
* 這種情況下,只有移動較小那一條邊才會有機會使得容量變大
* 這也叫短板效應
*/
class Solution {
public int maxArea(int[] height) {
int max = 0;
int highLine , lowLine;
int i = 0; int j = height.length-1;
while (i<j){
max = Math.max(max,Math.min(height[i],height[j])*(j-i));
if(height[i]<=height[j]){
i++;
}else {
j--;
}
}
return max;
}
}
//leetcode submit region end(Prohibit modification and deletion)