Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[leetcode]No. 11 盛水最多的容器 #43

Open
liangbus opened this issue Apr 18, 2020 · 0 comments
Open

[leetcode]No. 11 盛水最多的容器 #43

liangbus opened this issue Apr 18, 2020 · 0 comments

Comments

@liangbus
Copy link
Owner

liangbus commented Apr 18, 2020

No. 11 盛水最多的容器
给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。

image

图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

 
示例:

输入:[1,8,6,2,5,4,8,3,7]
输出:49

看到这题,容易就是想到双指针,但开始做的时候,是同时移动了两个指针,还有交替移动指针,这导致了有些区间是没有遍历到,后来看了一下提示,瞬间 get 到,因为容器边界也是由较小的边界决定,所以应该只要移动值更小的指针即可

难点:

为什么只要移动更小指针就可以了?

反证法,假设移动的是更大的指针,min(x,y)∗t=x∗t,t 为两点之间水平距离,假设 y 是更大值,因为 t 肯定是递减的,并且容积由更小的边界决定,因此移动之后的容量不再可能大于 x*t

/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function(height) {
    if(height.length < 2) return 0
    let left = 0, right = height.length - 1
    let max = 0
    while(left < right) {
        // 取更小值作为边界
        let h = Math.min(height[left], height[right])
        max = Math.max(h * (right - left), max)
        // 移动更小值的指针
        if(height[left] === h) {
            left++
        } else {
            right--
        }
    }
    return max
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant