算法探索_盛最多水的容器

问题描述:

给你 n 个非负整数 a1,a2,...,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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/container-with-most-water

解决思路:

我已经在注释中写明了过程,这道题的难度咋一看还行,仔细一看就简单异常

1.首先确认它的面积公式:随便挑两个数,下标的差值乘以两数的较小数

2.列出所有可能性(这边有一个优化点)

去除前后颠倒但是结果一样的组合  (从前往后扫描,去除反向扫描)

也就是说 每次扫描只要扫描 i往后的数  故j=i+1

    /*
     *作者:赵星海
     *时间:2020/7/25 14:53
     *用途:盛最多水的容器
     */
    public int maxArea(int[] height) {
        //首先要明白 随便挑两个数  它的面积公式是   下标的差值乘以两数的较小数
        int max = 0;
        //简单粗暴,列出所有可能性
        for(int i = 0;i<height.length-1;i++){
            //j=i+1   提高效率 去除前后颠倒结果一样的组合  (从前往后扫描,去除反向扫描)
            for(int j= i+1;j<height.length;j++){
                int x = (j-i)*Math.min(height[i],height[j]);
                if(x>max){
                    max = x;
                }
            }
        }
        return max;

    }

执行结果:

猜你喜欢

转载自blog.csdn.net/qq_39731011/article/details/107578855