396,雙指標求盛最多水的容器

2021-10-09 17:07:21 字數 2173 閱讀 9019

給你 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

intmaxarea

(int

height)

}return maxarea;

}

雙指標求解根據木桶原理,桶的容量是由最短的木板決定的,所以這裡矩形的高度也是由最矮的柱子所決定的。我們可以使用兩個指標,乙個left指向左邊的柱子,以他的高為矩形的高度,然後從最右邊開始往左掃瞄,找到比left柱子高的為止(如果沒找到,那麼矩形的寬度就是0)。計算矩形面積之後,left再往右移一位,再以同樣的方式繼續查詢……。

比如下面的圖中計算以第1個柱子的高度為矩形的高度,因為高度一定,要想使矩形的面積最大,就只能是矩形的寬度最大,所以這裡從陣列的最後面開始找,找到乙個比3大或者等於3的值即可,如果沒找到那麼寬度就是0。

我們查詢的時候為了防止遺漏,不光從前面開始找,而且還要從後面開始找,需要兩遍查詢,**如下

public

intmaxarea

(int

height)

else

}//計算矩形的面積

area = height[left]

*(right - left)

;//儲存計算過的最大的面積

maxarea = math.

max(maxarea, area)

; left++;}

//從後面開始找,和上面類似

right = length -1;

while

(right >0)

else

} area = height[right]

*(right - left)

; maxarea = math.

max(maxarea, area)

; right--;}

return maxarea;

}

雙指標優化上面的**我們兩個方向都要查詢,是不是感覺有點麻煩,我們再認真看下這個圖

比如我們以3為矩形的高度,查詢矩形寬度的時候從最右邊開始往左找,找到比3大的為止,這裡找到了4,那麼柱子3到柱子4中間所圍成的矩形高度就是柱子3的高度。如果我們從右邊開始找的時候是小於3的,比如這裡是2,那麼我們這裡是不是找到了以2為高度的矩形的最大面積。也就是相當於我們可以把從前往後和從後往前找合併為乙個,所以這裡**就非常簡潔了,我們來看下

public

intmaxarea

(int

height)

return maxarea;

}

這題基本上沒什麼難度,主要考察對雙指標的使用。

盛最多水的容器(雙指標)

今天在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 左指標移動...