給你 n 個非負整數 a1,a2,…,an,每個數代表座標中的乙個點 (i, ai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。
說明:你不能傾斜容器,且 n 的值至少為 2。如圖:
1. 暴力法
首先還是用簡單的思路來解答,這個題簡答的可以化解為求面積最大的長方形面積,而長方形的高是兩個數值之中的較小值,寬是兩個數值的指標的相差,為了主程式看起來簡單,我們可以設定兩個比較簡單的,由於要兩次遍歷,所以時間複雜為o(n2)**如下:
[
func
maxarea
(height [
]int
)int
}return finalout
}func
min(a,b int
)int
else
}func
max(a,b int
)int
else
}
2.雙指標
仔細看剛剛那個演算法,其實是列舉出了所有的長方形方塊,然後取最大值,那麼有沒有可以優化器演算法的能力呢? 有的。如果我們無須列舉所有的方塊,就可以等到最優解
其實這個盛水容器的問題,其根本在於每提高一次的高度和每減少一次的寬度之間的,帶來的面積變化問題,所以,有一些高度沒有發生改變,但長度變小的方塊,就沒有必要列舉了。
舉個例子,如圖所示中,較小的方塊很明顯不會大於較大的方塊,換句話說,當最低邊框不變時,以此邊框為高的最大長方形也就被限定了。
所以,我們只需要將兩邊的數字向中間推進即可,也就是如圖中紅,綠,橙,黑四色變換的四個框,計算量比之前的窮舉就節約下了很多。
具體**如下:
func
maxarea
(height [
]int
)int
else
finalout =
max(finalout,temp)
if b==a
}return finalout
}func
max(a,b int
)int
else
}
以 每日一題 Leetcode11 盛最多水的容器
2021 3 9 今天的每日一題是leetcode11.盛最多水的容器,這道題曾經在某個熱身賽裡碰到過,當時想錯了就沒做出來,現在看到真是感慨良多。題意如下 給你 n 個非負整數 a1,a2,an,每個數代表座標中的乙個點 i,ai 在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 i,ai ...
LeetCode每日一題 003 盛最多水的容器
想法一 盛水最多,即左右兩邊中間區域的矩形面積最大,稱左側為a邊,右側為b邊。比較直觀的解法是,固定某一邊 如a邊 依次比較b邊選取哪乙個所框住區域面積最大。因此,可以比較選取不同a邊所能框住面積的最大值,從而得到所有可能情況的最大值,及窮舉法。可通過雙層迴圈求解。想法二 在想法一基礎上,思考固定a...
每日一刷 LeetCode 11盛水最多的容器
給你 n 個非負整數 a1,a2,an,每個數代表座標中的乙個點 i,ai 在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 i,ai 和 i,0 找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。說明 你不能傾斜容器,且 n 的值至少為 2。圖中垂直線代表輸入陣列 1,8,...