11. Container With Most Water

Posted limaodeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了11. Container With Most Water相关的知识,希望对你有一定的参考价值。

1.题目描述

英文版:

Given n non-negative integers a1, a2, ..., an , where each represents a point at

coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i

is at (i, ai) 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

中文版:

给n个非负整数a1,a2,a3.....,an,他们可以用坐标表示为(i,ai)。

绘制n条垂直线,线i的两个端点位于(i,ai)和(i,0)。

寻找两条线,使他们与x轴组成一个容器,

并且这个容器能够装最多的水。

注意:你不能倾斜容器,并且n大于等于2。

技术图片

以上的垂直线代表数组[1,8,6,2,5,4,8,3,7],在这个例子中,容器能装最大面积的水为49.

例子:

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

输出: 49

2.解法

2.1 解法1

思路:

当看到这道题的时候,第一反应就是使用暴力法破解。双重循环遍历所有值进行两两相加,保存最大的那个值并返回。但是时间复杂度非常的高,可以看在LeetCode上运行的结果图。

    public static int maxArea1(int[] array) {
        int maxArea = 0;
        for(int i = 0;i < array.length;i++){
            for(int j = i+1;j < array.length;j++){
                int currentArea = (j - i) * Math.min(array[i],array[j]);
                if(currentArea > maxArea){
                    maxArea = currentArea;
                }
            }
        }
        return maxArea;
    }

在LeetCode上运行的结果:

技术图片

2.2 解法2

思路:

这种解法是使用两个指针进行破解,第一个指针i从0开始往后遍历,第二个指针j从array.length - 1开始往前遍历。如果第i个数小于j个数,则i继续往后移;
如果第i个数大于第j个数,则j继续往前移。在移动的过程中不断的刷新最大值,最后返回。

代码实现:
    public static int maxArea2(int[] array) {
        int i = 0;
        int j = array.length - 1;
        int maxArea = 0;
        while (i < j){
            maxArea = Math.max(maxArea,(j - i) * Math.min(array[i],array[j]));

            if(array[i] < array[j]){
                i++;
            }else {
                j--;
            }
        }
        return maxArea;
    }

在LeetCode上运行的结果:

技术图片

2.3 解法3

思路:

这种解法是在解法2的基础上稍微进行了一点优化。如果i在移动的过程中,第i个数与Math.min(array[i],array[j])相等,则继续往后移;
如果j在移动的过程中,第j个数与Math.min(array[i],array[j])相等,则继续往后移;

代码实现:
    public static int maxArea3(int[] array) {
        int i = 0;
        int j = array.length - 1;
        int maxArea = 0;
        while (i < j){
            int h = Math.min(array[i],array[j]);
            maxArea = Math.max(maxArea,(j - i) * h);

            while (i < j && array[i] == h) i++;
            while (i < j && array[j] == h) j--;
        }
        return maxArea;
    }

在LeetCode上运行的结果:

技术图片

3.测试

在本地,我只是简单写了一个main函数来对它进行测试。但是这些代码都是在LeetCode上运行通过了的。

    public static void main(String[] args) {
        int[] array = {1,8,6,2,5,4,8,3,7};
        int result = maxArea2(array);
        System.out.println(result);
    }
欢迎关注个人公众号,可直接扫描以下二维码或微信搜索“阿毛聊技术”。

技术图片

以上是关于11. Container With Most Water的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode11-Container With Most Water

leetcode 11. Container With Most Water

11. Container With Most Water

11. Container With Most Water

LeetCode11. Container With Most Water 解题报告

11. Container With Most Water