盛最多水的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明: 你不能倾斜容器。
最近忙着搬家,没怎么做题,懒惰了。
这个说明,真是高估我了。可以倾斜容器,CPU真的要烧掉。
题目限制数组长度最小为 2,思路还是比较简单。我是一遍过,很难得,感觉真不错。
计算容量,长乘高就可以。长度取两坐标间距离,高度为两坐标对应数值较小(就像木桶短板理论一样)。
直觉上看,影响因素很多,会有一种无从下手的感觉,首先要减少因素。自然想到双指针,指向头尾。这样一开始,长度就是最大值,向中间搜索时,长度递减,只需要考虑数组上数值的影响。
移动指针时,如果移动的是数值较大的,不仅长度减少 1,高度最高也只会和上次一样(高度受限于较小值),容量减少。假设移动的是较小值,如果查找到更大值,虽然长度减 1,高度却增加了,容积可能上升。
这样就明白了,需要移动数值较小的指针,向中间查找更大值。移动一次后,还是一样的分析步骤,只需要重复之前的动作即可,直到走完数组中所有值,两指针重合。
function maxArea(height) {
const len = height.length
let left = 0, right = len - 1
let max = 0
while(left < right){
// 计算最大值
max = Math.max(max, calc(left, right))
// 判断怎么移动指针
if(height[left] <= height[right]) {
left++
continue
}
right--
}
return max
function calc(i,j){
const length = Math.abs(j - i)
const width = Math.min(height[i], height[j])
return length * width
}
};