首先来看下水量怎么计算~
计算水量其实也就是计算面积,按照示例 1:height:[1,8,6,2,5,4,8,3,7]
。
随便选取两条线 height[i]
与 height[j]
,它们之间的距离为 j - i
,由木桶效应可以得知水量应由短的那条线计算出,看成面积就是:
area=min(height[i],height[j])×(j−i)
- 木桶效应:也可称为短板效应,是讲一只水桶能装多少水取决于它最短的那块木板。
然后思考应该怎么找到让其水量最大的两条线~
水量最大也就是面积最大,我们可以先让 j - i
最大,也就是先选取左右两侧最边上的两条线,从外向里找起。我们假设 height[i]
这条线长一些,即 height[i] > heigth[j]
,移动 i
或者移动 j
可以分情况考虑:
- 移动
i
即i = i + 1
:此时j - i
肯定会变小,那么height[i + 1]
即使变大了,但由于面积取决于短的那条线height[j]
,面积肯定也会减少。 - 移动
j
即j = j - 1
:此时j - i
虽然肯定变小,但是可能height [j - 1]
比原来大了,那么最终的面积有可能变大。
因此我们可以使用双指针指向左右两侧,每次向里移动 height
较小的指针,试图找到一个更大的面积。
javascript
/**
* @param {number[]} height
* @return {number}
*/
var maxArea = function (height) {
let res = 0
for (let i = 0, j = height.length - 1; i < j; ) {
res = Math.max(res, Math.min(height[i], height[j]) * (j - i))
height[i] < height[j] ? i++ : j--
}
return res
}