給你 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 左指標移動...