11. 盛最多水的容器
給你 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
解題思路
我們維護l,r兩個指針,作為容器的邊界,根據題意,我們裝水的高度由短的板決定,因為我們l,r指針是不斷靠攏的,裝水的寬度不斷縮小,因此我們必須要固定較高的邊界,移動較低的那個邊界,因為如果不移動低的邊界,我們的短板高度不變,寬度縮小了,必然比先前組成的容器更小。
代碼
class Solution {public int maxArea(int[] height) {int l=0,r=height.length-1,res=-1;while (l<r){res=height[l]>height[r]?Math.max(res,(r-l)*height[r--]):Math.max(res,(r-l)*height[l++]);}return res;}
}