create by db on 2021-3-11 16:10:51
Recently revised in 2021-3-11 16:22:59
閑時(shí)要有吃緊的心思,忙時(shí)要有悠閑的趣味
原題鏈接11. 盛最多水的容器 > 目錄
題目描述
給你 n 個(gè)非負(fù)整數(shù) a1,a2,...,an,每個(gè)數(shù)代表坐標(biāo)中的一個(gè)點(diǎn) (i, ai) 。在坐標(biāo)內(nèi)畫 n 條垂直線,垂直線 i 的兩個(gè)端點(diǎn)分別為 (i, ai) 和 (i, 0) 。找出其中的兩條線,使得它們與 x 軸共同構(gòu)成的容器可以容納最多的水。
說(shuō)明:你不能傾斜容器。
示例 1:
輸入:[1,8,6,2,5,4,8,3,7]
輸出:49
解釋:圖中垂直線代表輸入數(shù)組 [1,8,6,2,5,4,8,3,7]。在此情況下,容器能夠容納水(表示為藍(lán)色部分)的最大值為 49。
復(fù)制代碼
示例 2:
輸入:height = [1,1]
輸出:1
復(fù)制代碼
示例 3:
輸入:height = [4,3,2,1,4]
輸出:16
復(fù)制代碼
示例 4:
輸入:height = [1,2,1]
輸出:2
復(fù)制代碼
提示:
- n = height.length
- 2 <= n <= 3 * 104
- 0 <= height[i] <= 3 * 104
思路分析
思路一:暴力遍歷
逐個(gè)嘗試每?jī)蓷l bar 的組合,求出面積,得到最大的組合。
- 時(shí)間復(fù)雜度: O(n^2),循環(huán)運(yùn)行 n(n-1)/2 次
- 空間復(fù)雜度: O(1),只使用了常數(shù)個(gè)變量
tips:
很遺憾,這個(gè)算法被 LeetCode 判為超時(shí)……
思路二:雙指針循環(huán)
使用雙指針從兩端向中心移動(dòng),每次移動(dòng)較矮的那端以做其他的線段嘗試,仍然取最大組合。
循環(huán)一遍就可以了
- 時(shí)間復(fù)雜度:O(n)
- 空間復(fù)雜度:O(1)
AC 代碼
題解一:暴力遍歷
/**
* @param {number[]} height
* @return {number}
*/
var maxArea = function (height) {
if (height.length <= 1) {
return 0
}
let maxArea = 0
let area = 0
let minBar = 0
for (let i = 0; i < height.length; i++) {
for (let j = i + 1; j < height.length; j++) {
minBar = Math.min(height[i], height[j])
area = minBar * (j - i)
maxArea = Math.max(maxArea, area)
}
}
return maxArea
}
復(fù)制代碼
題解二:雙指針循環(huán)
/**
* @param {number[]} height
* @return {number}
*/
var maxArea = function (height) {
let left = 0
let right = height.length - 1
let result = 0
while (left < right) {
result = Math.max(
result,
(right - left) * Math.min(height[left], height[right])
)
if (height[left] < height[right]) {
left++
} else {
right--
}
}
return result
}
復(fù)制代碼
總結(jié)
三月你好,春暖花開(kāi)。加油!