leetcode11 盛最多水的容器
- 盛最多水的容器
给你 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
解题思路:
/*
先来分析一下这个题,这个题就是在说两根柱子之间的容器是要最大的,和以前的那个接雨水简直是小巫见大巫
* 这个是不管你中间的柱子的
* 因而要考虑的是左右的移动问题
* 那么我们来分析一下
* 首先我们中间容器的水的面积是min(h[i],[j])(j-i)
* 假设我们现在移动的是长的柱子,因为我们需要关注的是短的柱子的问题,因而当移动了长的柱子的话,我们来判断一下短柱的变化
* 短柱会有什么变化?
* 答案是要么不变,要么变小,不会变大
* 解释:要么你往里挪的那个柱子与原本的短柱子相比一样,则短板不变,
* 要么比那个短柱子大,那么短的还是原来的柱子,则短板不变,
* 要么是比那个短柱子小,则短板变小,
* 则综合来说这个面积是变小了,因为中间的距离减了1.
* 再来分析短的移动
* 短的移动,则短板的变化就是那三种情况,
* 也就是说只能来移动短板如此才有机会变大
*
* 那么综上来分析解题思路
* 我们需要一个res来负责最终最大的输出结果
*while(i<j)
的情况下进行比较
将现在情况下的面积放入res
* 随后需要来比较h[i]和h[j],哪个小就移动哪个,
* 随后将新的面积和原本的res进行比较,大的放入res
* return res
* */
public int maxArea(int[] height) {
int i=0,j=height.length-1,res=0;
while (i<j){
res=height[i]>height[j]?Math.max(res,(j-i)*height[j--]):Math.max(res,(j-i)*height[i++]);/*
写上面这行式子的时候用了一个问号表达式
同时需要注意的是那个j-i一定要写在前面
因为编译的过程是从前向后,如果你写在后面的话那么这个时候的i和j已经进行了自增和自减的运算
*/
}
return res;
}