Leetcode题库 - 盛最多水的容器(java语言版)

题目描述:

给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (iai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (iai) 和 (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

      这道题刚开始有点读不懂题,本以为是找最大子串,就是最大和的组合,最后才发现是求面积,下标差*最小下标对应的值,看得到的面积最大,输出最大的面积。

      这样这道题有两种思路:

       第一种就是我的好几篇博客中写到的,暴力for循环,也就是双重for循环,挨个比较,我们都知道一个水桶能盛多少水不是看最高的那个木板,而是看最短的那个,做人处事也是如此。那么这就和明确了,双重for循环从第一个看开始,挨个比较,每次挨个判断选择值小的那个,然后求面积,选择那个面积最大的是哪个。不断赋值个定义的变量area,最后得到的那个area就是最终结果。这种方法不推荐因为时间复杂度太高了O(n^2)

       第二种思路:就是我前三篇博客中经常提到的对撞指针法,定义两个指针,前后各一个,将前后两个元素进行比较选择最小的那个值然后求面积(下标对应的值乘以下标差(格数,长度),得到一个面积赋值给area,然后将小的那个值对应的下标向左(向右移动)继续判断最小的那个值,继续求面积,继续比较面积,最大的那个值就是水最多的容器。)

      代码如下:

 int [] a = new int[]{1,8,6,2,5,4,8,3,7};
//        盛多少水由最短的那个元素确定。(重点)
        int area = 0;

//     第一种方法暴力for循环,每个元素挨个比较,选取最小的,乘以下标之差。将得到的积最大的那个赋值给变量area,这样就得到了最多能盛多少水的容器

        for (int i = 0;i<a.length;i++){
            for (int j = i+1;j<a.length;j++){
                //选取最小的那个值
                if (a[i]<a[j]){
//       这个地方也可以用if来判断大小,用库函数简单点
                    //将小的那个数(对应的宽)乘以下标的差(对应的长)得到面积,与area比较,大的那个赋值给area。
                    area = Math.max (area, a[i]*(j-i));
                }else {
                    area = Math.max (area, a[j]*(j-i));
                }
            }
        }

执行结果:

执行用时:

第二种方法:

/        第二种方法:对撞指针
//        定义两个指针,前后各一个,将前后两个元素进行比较选择最小的求面积(下标对应的值乘以下标差(格数,长度),得到一个面积赋值给area,然后将小的那个值对应的下标向左(向右移动)继续判断最小的那个值,继续求面积,继续比较面积(要面积大的),最大的那个值就是水最多的容器。)
        int j = a.length-1;
        for (int i = 0;i<j;){
               if (a[i]<a[j]){
                   area = Math.max (area,a[i]*(j-i));
                   i++;
               }else {
                   area = Math.max (area,a[j]*(j-i));
                   j--;
               }
        }
        System.out.println(area);
    }

执行结果:

执行用时:

   总结:这道题还是用对撞指针来做方便,代码量少,时间复杂度低。比暴力for循环底了100倍。对撞指针是一个很好的方法,值得去好好研究。

2019-3-9

发布了43 篇原创文章 · 获赞 6 · 访问量 6671

猜你喜欢

转载自blog.csdn.net/weixin_37850160/article/details/88369739