题目描述如下:
思路1:
暴力破解, 两重for循环:
function maxArea(nums: number[]): number {
if (nums.length < 1) return 0;
let res = 0;
for (let i = 0; i < nums.length; ++i) {
for (let j = i + 1; j < nums.length; ++j) {
const tmp = Math.min(nums[i], nums[j]) * (j - i);
res = Math.max(tmp, res)
}
}
return res;
}
然后:
换个思路, 双指针移动。
function maxArea(nums: number[]): number {
if (nums.length < 1) return 0;
let res = 0;
/**
* 双指针
* 根据上面的 代码得出 伪代码 为:
* res = max(res, min(nums[i], nums[j]) * (j - i));
* 现在思路为 双指针该移动哪一根?
* 转化为数学题:
* 当移动 当前值较大的指针 较移动 当前值较小的指针 面积变小了 (核心)
* 所以每次移动 值较小的指针
*/
let i = 0;
let j = nums.length - 1;
while (i < j) {
let tmp = Math.min(nums[i], nums[j]) * (j - i);
res = Math.max(tmp, res);
if (nums[i] > nums[j]) j--;
else i++;
}
return res;
}