Leetcode题库 - 盛最多水的容器(java语言版)
题目描述:
给定 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
这道题刚开始有点读不懂题,本以为是找最大子串,就是最大和的组合,最后才发现是求面积,下标差*最小下标对应的值,看得到的面积最大,输出最大的面积。
这样这道题有两种思路:
第一种就是我的好几篇博客中写到的,暴力for循环,也就是双重for循环,挨个比较,我们都知道一个水桶能盛多少水不是看最高的那个木板,而是看最短的那个,做人处事也是如此。那么这就和明确了,双重for循环从第一个看开始,挨个比较,每次挨个判断选择值小的那个,然后求面积,选择那个面积最大的是哪个。不断赋值个定义的变量area,最后得到的那个area就是最终结果。这种方法不推荐因为时间复杂度太高了O(n^2)
第二种思路:就是我前三篇博客中经常提到的对撞指针法,定义两个指针,前后各一个,将前后两个元素进行比较选择最小的那个值然后求面积(下标对应的值乘以下标差(格数,长度),得到一个面积赋值给area,然后将小的那个值对应的下标向左(向右移动)继续判断最小的那个值,继续求面积,继续比较面积,最大的那个值就是水最多的容器。)
代码如下:
[code] 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)); } } }
执行结果:
执行用时:
第二种方法:
[code]/ 第二种方法:对撞指针 // 定义两个指针,前后各一个,将前后两个元素进行比较选择最小的求面积(下标对应的值乘以下标差(格数,长度),得到一个面积赋值给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
- Leetcode题库 - 两个数组的交集(java语言版)
- Leetcode题库 - 快乐数(java语言版)
- Leetcode题库 - 存在重复元素(java语言版)
- Leetcode题库 - 有效的字母异位词(java语言版)
- Leetcode题库-存在重复元素2(java语言版)
- Leetcode题库-存在重复元素3(java语言版)
- Leetcode题库-四数相加2(java语言版)
- Leetcode题库-字母异位词分组(java语言版)
- Leetcode题库-回旋镖的数量(java语言版)
- Leetcode题库 - 三数之和(java语言版)
- Leetcode题库 - 同构字符串(java语言版)
- Leetcode题库-四数之和(java语言版)
- Leetcode题库 - 两个数组的交集2(java语言版)
- Leetcode题库 - 长度最小的子数组(java语言版)
- Leetcode题库 - 根据字符出现频率排序(java语言版)
- leetcode-java.T011_ContainerWithMostWater 找两条竖线然后这两条线以及X轴构成的容器能容纳最多的水
- LeetCode11.python实现: 盛最多水的容器问题☆☆
- LeetCode题解(python)-11. 盛最多水的容器
- 盛最多水的容器--java
- Container With Most Water 求容器里能放最多的水 @LeetCode