
这道题和接雨水不一样,不能用前缀和,后缀和来做。
核心思路:两条高中,短的那条决定了长方形的高度,证明如果移动长的那条,那么中间的面积只会缩小:宽短了并且高度不会增加
js
/**
* @param {number[]} height
* @return {number}
*/
// 一句话思路:S(i,j)=min(h[i],h[j])×(j−i)
// 在每个状态下,无论长板或短板向中间收窄一格,都会导致水槽 底边宽度 −1 变短:
// 若向内 移动短板 ,水槽的短板 min(h[i],h[j]) 可能变大,因此下个水槽的面积 可能增大 。
// 若向内 移动长板 ,水槽的短板 min(h[i],h[j]) 不变或变小,因此下个水槽的面积 一定变小 。
// 初始化双指针分列水槽左右两端,循环每轮将短板向内移动一格,并更新面积最大值,直到两指针相遇时跳出;即可获得最大面积。
var maxArea = function (height) {
let i = 0,
j = height.length - 1,
area = 0
while (i < j) {
// i 是短板
if (height[i] < height[j]) {
area = Math.max(height[i] * (j - i), area)
i++
}
// 一样长或者j是短板
// 一样长的话,选哪个都可以
else {
area = Math.max(height[j] * (j - i), area)
j--
}
}
return area
}