一、题目描述
二、解题思路
/**
* @param {number[]} height
* @return {number}
* 是一道动态规划,求最大值。
* 进行优化,砍重复计算分支
* 求每一次的面积:min(height1, height2) * (index2 - index1);
* 先写出计算每个情况的表达式
* 然后在优化
* 执行用时:1164 ms, 在所有 JavaScript 提交中击败了28.66%的用户
* 内存消耗:40.3 MB, 在所有 JavaScript 提交中击败了90.28%的用户
* 方案一:采用冒泡循环穷举,时间复杂度:O(n^2)
*/
var maxArea = function(height) {
let max = 0;
for (let i = 0; i < height.length - 1; i++) {
for (let j = i + 1; j < height.length; j++) {
const area = Math.min(height[i], height[j]) * (j - i);
max = max < area ? area : max;
}
}
return max;
};
/**
* 看了题解,是一道标准的双指针问题,两边向中间移动搜索。
* 思路是:两个指针分别指向两端,每次判断哪一个指针值比较小,
* 然后移动比较小的。因为每一次移动距离会变小,那么大的保证最大边,改变小的即可
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
var maxArea = function(height) {
let i = 0;
let j = height.length - 1;
let res = 0;
while (i < j) {
res = Math.max(res, Math.min(height[i], height[j])*(j-i));
if (height[i] > height[j]) {
j--
} else {
i++
}
}
return res
}
// 总结,双指针问题是不是可以通过冒泡解决,相反冒泡的题是否都可以通过双指针进行优化