日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode最小面积_每日一道 LeetCode (51):盛最多水的容器

發布時間:2024/4/18 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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):盛最多水的容器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。