leetcode最小面积_每日一道 LeetCode (51):盛最多水的容器
每天 3 分鐘,走上算法的逆襲之路。
?前文合集
每日一道 LeetCode 前文合集
代碼倉庫
GitHub:https://github.com/meteor1993/LeetCode
Gitee:https://gitee.com/inwsy/LeetCode
題目:盛最多水的容器
難度:「中等」
題目來源:https://leetcode-cn.com/problems/container-with-most-water/
給你 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
解題思路
今天這道題蠻有意思的,給出一個數組,實際上是在求這個數組之間可以組成的最大面積。
這道題正統的解法是使用雙指針,因為是在數組之間灌水,能容納的水有多少是取決于那個最小的數字,所以我們先把兩個指針分別指向數組的頭和尾,先求一下當前的面積,然后比較下頭尾的大小,每次移動較小的那個指針,把整個數組迭代一遍,取出其中的最大值即可。
public?int?maxArea(int[]?height)?{????int?len?=?height.length;
????int?start?=?0,?end?=?len?-?1;
????int?maxArea?=?0;
????while?(start?!=?end)?{
????????int?area?=?Math.min(height[start],?height[end])?*?(end?-?start);
????????maxArea?=?Math.max(area,?maxArea);
????????if?(height[start]?????????????start++;
????????}?else?{
????????????end--;
????????}
????}
????return?maxArea;
}
代碼看起來不難,聲明一點哈,上面這個方案不是我想出來的,是看了答案的提示以后才知道的。
但是這里面有個問題,為什么這種方案是可以找到最大的面積的,難道就不會存在其他的情況么?
下面的這個證明方案同樣來自于答案當中,用來證明上面這個方案的正確性。
雙指針代表的是可以作為容器邊界的所有位置的范圍。在一開始,雙指針指向數組的左右邊界,表示數組中所有的位置都可以作為容器的邊界,因為我們還沒有進行過任何嘗試。
在這之后,我們每次將對應的數字較小的那個指針往另一個指針 方向移動一個位置,就表示我們認為這個指針不可能再作為容器的邊界了。
那么為啥這個指針不能在作為容器的邊界了,下面是這個問題的證明:
首先考慮第一步,假設當前左指針和右指針指向的數分別為 x 和 y,先假設 x < y ,同時兩個指針之間的距離為 t ,那么他們組成的容器的容量為:
min(x,?y)?*?t?=?x?*?t這時可以斷定,如果我們保持左指針的位置不變,那么無論右指針在哪里,這個容器的容量都不會超過 x * t 了。注意這里右指針只能向左移動,因為我們考慮的是第一步,也就是指針還指向數組的左右邊界的時候。
我們任意的移動右指針,指向的數字為 y1 ,兩個指針之間的距離為 t1 ,那么顯然有 t1 < t ,并且 min(x, y1) <= min(x, y) 。
- 如果 y1 <= y 那么有 min(x, y1) <= min(x, y) 。
- 如果 y1 > y 那么有 min(x, y1) = x <= min(x, y) 。
因此剛才上面的那個公式可推導:
min(x,?y1)?*?t1?=?min(x,?y)?*?t?即無論我們怎么移動右指針,得到的容器的容量都小于移動前容器的容量。也就是說,這個左指針對應的數不會作為容器的邊界了,那么我們就可以丟棄這個位置,將左指針向右移動一個位置,此時新的左指針于原先的右指針之間的左右位置,才可能會作為容器的邊界。
這樣以來,我們將問題的規模減小了 11,被我們丟棄的那個位置就相當于消失了。此時的左右指針,就指向了一個新的、規模減少了的問題的數組的左右邊界,接下來,我們可以重復上面的這個過程,接著縮小容器邊界。
感謝閱讀
總結
以上是生活随笔為你收集整理的leetcode最小面积_每日一道 LeetCode (51):盛最多水的容器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flowable工作流 流程变量_Act
- 下一篇: 博途上载hmi程序_西门子HMI触摸屏(