JS_LeetCode05:盛最多水的容器

img

5.盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0)(i, height[i])

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

贪心算法

总是在当前条件下做出最优选择!

首先,要知道水的容量由长宽高决定,这里的宽固定了,因此取决于长(木板间的距离)和高(最短木板的高度)。我们从两端分别设置指针开始,此时的长是最长的!更新当前的水容量,尝试移动短木板所在指针,如此更新水容量,直到双指针相遇。

? 为什么是移动短木板的指针呢

水的容量由短木板决定,假设移动长木板的指针,可能下一次的木板更短或者更长,但两种情况导致的水容量只会更少。而移动短木板所在的指针,下一次的水容量会有增加的机会。

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* @param {number[]} height
* @return {number}
*/
var maxArea = function(height) {
let left = 0
let right = height.length-1
let max = 0
while (left < right){
let x_len = right - left
let y_len = Math.min(height[left],height[right])
let v_water = x_len * y_len
max = Math.max(max,v_water)
if (height[left]<height[right]){
left ++
}else {
right --
}
}
return max
};