例題:
給你 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
這道題目簡單來說就是x軸乘y軸能夠得到的最大面積(y軸取較小的那乙個)
這道題目採取雙指標法解題(後面我們再講解雙指標法的正確性)
示例:[1,8,6,2,5,4,8,3,7]
分析:
首先,將左右指標分別放在陣列左右兩端。
面積公式就是:兩個指標指向的數字中較小值∗指標之間的距離
此時有 最大容量: min (1,7) * 8 = 8 ⇒ min(nums[0],nums[8]) * (8-0)
此時我們要開是移動指標,我們可以分析得到我們應該移動較小的那個指標也就是左指標,如果我們移動較大的那個指標,因為前面較小的值沒有變化,並且間隔減小,這個乘機就減小了。所以我們移動數字較小的那個指標。
所以,我們將左指標向右移動:[x,8,6,2,5,4,8,3,7]
容納的水量為 min(8,7)∗7=49。
由於右指標對應的數字較小,我們移動右指標:[x,8,6,2,5,4,8,3,x]
容納的水量為 min(8,3)∗6=18。
由於右指標對應的數字較小,我們移動右指標:[x,8,6,2,5,4,8,x,x]
此時可以容納的水量為 min(8,8)∗5=40。
兩指標對應的數字相同,我們可以任意移動乙個,例如左指標:[x,x,6,2,5,4,8,x,x]
容納的水量為 min(6,8)∗4=24。
由於左指標對應的數字較小,我們移動左指標,並且可以發現,在這之後左指標對應的數字總是較小,因此我們會一直移動左指標,直到兩個指標重合。在這期間,對應的可以容納的水量為:min(2,8)∗3=6,min(5,8)∗2=10,min(4,8)∗1=4
所以從我們記錄的值可以得出最大融水量為49
為什麼我們雙指標法是正確的(移動哪乙個指標)
在我們選擇移動指標的時候,我們無非就是兩個選擇:左指標和右指標。當我們移動較大的那個指標時,我們的值只會比原來的值小(兩個指標指向的數字中較小值∗指標之間的距離),那麼我們移動這個指標得到的值沒有任何意義(要求最大值)。因為對於較小的這個指標我們已經獲取到了它的最大值,我們可以捨棄掉這個左邊界(這就是為什麼要把左右指標放在左右兩邊)
所以我們應該移動指標較小的這個指標,這樣相當於每次我們都排除掉乙個邊界,將問題的規模減小了1。被丟棄的那個位置相當於消失了。時的左右指標,就指向了乙個新的、規模減少了的問題的陣列的左右邊界
**
class solution else
}return ans;}}
盛最多水的容器(雙指標)
今天在leetcode上刷了一道題用到了雙指標,現在把這種精妙的解法記錄下來 題目傳送門 題目的大意就是要找到乙個最大的min s i s j j i 那麼這時候我是一點思路都沒,然後題解指出了乙個雙指標的做法,我們先討論這個東西的合理性,初始情況,將i,j放到陣列的開始和結尾,此時,我們能拿到乙個...
11 盛最多水的容器(雙指標)
解法1 二重迴圈,遍歷陣列,列舉出所有容器可能的容積,比較哪乙個容積最大。class solution return max 解法2 雙指標解法,一次遍歷,雙指標一頭一尾開始移動,根據題意,所指向元素小的指標每次移動乙個位置。因為容納的水量是由兩個指標指向的數字中較小值 指標之間的距離決定的。如果我...
11 盛最多水的容器 雙指標
左右指標 ans 0while l r 左右指標指向同乙個元素的時候退出迴圈 area min height l height r r l 面積 最短擋板 間距 ans max ans,area 答案只想要最大的面積 if height l height r 左擋板 小於 右擋板 l 1 左指標移動...