The Wayback Machine - https://web.archive.org/web/20210125130838/https://github.com/grandyang/leetcode/issues/11
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] 11. Container With Most Water #11

Open
grandyang opened this issue May 30, 2019 · 2 comments
Open

[LeetCode] 11. Container With Most Water #11

grandyang opened this issue May 30, 2019 · 2 comments

Comments

@grandyang
Copy link
Owner

@grandyang grandyang commented May 30, 2019

 

Given  n  non-negative integers  a1a2 , ...,  an , where each represents a point at coordinate ( iai ).  n  vertical lines are drawn such that the two endpoints of line  i  is at ( iai ) and ( i , 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.

Note: You may not slant the container and  n is at least 2.

 

The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is 49.

 

Example:

Input: [1,8,6,2,5,4,8,3,7]
Output: 49

 

这道求装最多水的容器的题和那道 Trapping Rain Water 很类似,但又有些不同,那道题让求整个能收集雨水的量,这道只是让求最大的一个的装水量,而且还有一点不同的是,那道题容器边缘不能算在里面,而这道题却可以算,相比较来说还是这道题容易一些,这里需要定义i和j两个指针分别指向数组的左右两端,然后两个指针向中间搜索,每移动一次算一个值和结果比较取较大的,容器装水量的算法是找出左右两个边缘中较小的那个乘以两边缘的距离,代码如下:

 

C++ 解法一:

class Solution {
public:
    int maxArea(vector<int>& height) {
        int res = 0, i = 0, j = height.size() - 1;
        while (i < j) {
            res = max(res, min(height[i], height[j]) * (j - i));
            height[i] < height[j] ? ++i : --j;
        }
        return res;
    }
};

 

Java 解法一:

public class Solution {
    public int maxArea(int[] height) {
        int res = 0, i = 0, j = height.length - 1;
        while (i < j) {
            res = Math.max(res, Math.min(height[i], height[j]) * (j - i));
            if (height[i] < height[j]) ++i;
            else --j;
        }
        return res;
    }
}

 

这里需要注意的是,由于 Java 中的三元运算符 A?B:C 必须须要有返回值,所以只能用 if..else.. 来替换,不知道 Java 对于三元运算符这么严格的限制的原因是什么。

下面这种方法是对上面的方法进行了小幅度的优化,对于相同的高度们直接移动i和j就行了,不再进行计算容量了,参见代码如下:

 

C++ 解法二:

class Solution {
public:
    int maxArea(vector<int>& height) {
        int res = 0, i = 0, j = height.size() - 1;
        while (i < j) {
            int h = min(height[i], height[j]);
            res = max(res, h * (j - i));
            while (i < j && h == height[i]) ++i;
            while (i < j && h == height[j]) --j;
        }
        return res;
    }
};

 

Java 解法二:

public class Solution {
    public int maxArea(int[] height) {
        int res = 0, i = 0, j = height.length - 1;
        while (i < j) {
            int h = Math.min(height[i], height[j]);
            res = Math.max(res, h * (j - i));
            while (i < j && h == height[i]) ++i;
            while (i < j && h == height[j]) --j;
        }
        return res;
    }
}

 

Github 同步地址:

#11

 

类似题目:

Trapping Rain Water

 

参考资料:

https://leetcode.com/problems/container-with-most-water/

https://leetcode.com/problems/container-with-most-water/discuss/6090/Simple-and-fast-C%2B%2BC-with-explanation

https://leetcode.com/problems/container-with-most-water/discuss/6091/Easy-Concise-Java-O(N)-Solution-with-Proof-and-Explanation

 

LeetCode All in One 题目讲解汇总(持续更新中...)

@marshallou
Copy link

@marshallou marshallou commented Nov 14, 2019

Hello, 感谢分享,有个关于vector subscript的疑问,我看c++ primer书上访问vector一般写法是这样的

decltype(vector.size()) i = 0;
vector[i]

直接定义i 为int type是否不太好?

不过定义成int,当vector是empty的时候,代码不会出错。如果是vector::size_type,-1会被当成max unsigned int.

@grandyang
Copy link
Owner Author

@grandyang grandyang commented Nov 14, 2019

vector.size() 就是 unsigned int 型的,可以直接定义i 为int,唯一要注意的是 vector.size() 做减法的时候要先将其转为 int 型,例如 (int)vector.size() - 2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
2 participants