原题链接:leetcode11
题目描述:长度为n的数组height,有n条垂线,找出两条垂线间能容纳的最多水量
思路:
思路一:采用暴力的方式,双层循环处理,第一层循环拿到每一元素,然后第二层循环依次拿剩下的元素计算面积,每次计算完和已经计算的面积拿最大面积,双层循环完成得到最大面积,即为盛最多水。
这种双层循环类似冒泡算法。时间复杂度是平方
思路二:采用双指针处理方式,双指针可以将两层循环降为单层循环处理,减少循环次数,从而降低时间复杂度。时间复杂度是n级别的
左指针从下标0开始,右指针从最后一个元素的位置开始,然后计算面积,由于盛水量的高度由最低的元素值决定,所以左右两个指针对应的元素值小的往后移动,然后重新进行计算,直到两个指针所指的元素为同一个元素终止循环计算。得到最终的最大面积
/**
* @param {number[]} height
* @return {number}
*/
/**
* 思路:首先两层循环就可以解决,这样的话所有的都去进行了计算和比较
* 单层循环的话,需要双指针,
*/
var maxArea = function (height) {
let n = height.length
let left = 0, right = n - 1
let area = 0
while (left < right) {
// 宽度为left和right之间的距离,高为height[left], heigth[right]之间最小的
area = Math.max((right - left) * Math.min(height[left], height[right]), area)
// height[left], heigth[right]哪个小就往后重新找值计算,直到左右两边元素相遇
height[left] < height[right] ? left++ : right--
}
return area
};
let height = [1, 8, 6, 2, 5, 4, 8, 3, 7]
height = [1, 2]
console.log(maxArea(height))