【日常学习-算法:盛最多水的容器】

29 阅读1分钟

【题目】:leetcode.cn/problems/co…

给定一个长度为 `n` 的整数数组 `height` 。有 `n` 条垂线,第 `i` 条线的两个端点是 `(i, 0)` 和 `(i, height[i])` 。

找出其中的两条线,使得它们与 `x` 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

**说明:** 你不能倾斜容器。

第一想法:如何确定最大面积的2个端点? 跑起来发现,[1,2,1] 直接就跪了,逻辑有问题,咋整,看答案呗

var maxArea = function(height) {
    let max = 0;
    let start = 0;
    for (let i = 1; i < height.length; i += 1) {
        const w = i - start;
        const h = Math.min(height[i], height[start])
        if (w * h > max) {
            max = w * h
        }

        if (height[i] > height[start]) {
            start = i
        }
    }
    return max;
};

答案:双指针,不理解,咋就能算出最大面积? Qwen-ai: `这个算法通过“总是移动较短的那根线”的策略,系统地排除了所有不可能产生更大面积的情况。它不是随机地丢弃组合,而是基于一个严格的数学逻辑:以当前较短线为一边的所有其他组合,其面积都不可能超过当前组合。

因此,它保证能找到全局最大值,而不会有任何遗漏。`

这感觉:字都认识,思路打不开。。。。(脑子:已暂存)

var maxArea = function(height) {
    let ans = 0, left = 0, right = height.length - 1;
    while (left < right) {
        const area = (right - left) * Math.min(height[left], height[right]);
        ans = Math.max(ans, area);
        if (height[left] < height[right]) {
            left++;
        } else {
            right--;
        }
    }
    return ans;
};