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

圖中垂直線代表輸入陣列 [1,8,6,2,5,4,8,3,7],在此情況下,容器能夠容納水(表示為藍色部分)的最大值為 49,
示例:
輸入: [1,8,6,2,5,4,8,3,7]
輸出: 49
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/container-with-most-water
難度:中等
題解
我的題解
思路:最簡單就是算出每個容器的容量,然后比較出容量最大的
public int maxArea(int[] height) {
int area = 0;
for (int i = 0; i < height.length; i++) {
for (int j = i+1; j < height.length; j++) {
area = Math.max((j - i) * Math.min(height[i], height[j]), area);
}
}
return area;
}
一般用這種暴力法能解決的問題,大多數都可以進行優化,演算法不僅僅是要解決問題,還要優雅的解決問題,這道題如何進行優化呢?
官方題解
官方題解就是對前面解法的優化
方法:雙指標法
思路:我們在由線段長度構成的陣列中使用兩個指標,一個放在開始,一個置于末尾, 此外,我們會使用變數maxarea 來持續存盤到目前為止所獲得的最大面積, 在每一步中,我們會找出指標所指向的兩條線段形成的區域,更新 maxarea,并將指向較短線段的指標向較長線段那端移動一步,為了使面積最大化,我們需要考慮更長的兩條線段之間的區域,如果我們試圖將指向較長線段的指標向內側移動,矩形區域的面積將受限于較短的線段而不會獲得任何增加,但是,在同樣的條件下,移動指向較短線段的指標盡管造成了矩形寬度的減小,但卻可能會有助于面積的增大,因為移動較短線段的指標會得到一條相對較長的線段,這可以克服由寬度減小而引起的面積減小,
public int maxArea(int[] height) {
int maxarea = 0, l = 0, r = height.length - 1;
while (l < r) {
maxarea = Math.max(maxarea, Math.min(height[l], height[r]) * (r - l));
if (height[l] < height[r])
l++;
else
r--;
}
return maxarea;
}
復雜度分析
時間復雜度:O(n),一次掃描,
空間復雜度:O(1),使用恒定的空間
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/138797.html
標籤:其他
