leetcode11.盛水最多的容器

leetcode11.盛水最多的容器

二月 21, 2020

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

示例:
输入: [1,8,6,2,5,4,8,3,7]
输出: 49

说一下思路,这题只要把思路想明白,其实就很简单。决定能装多少水的因素有两个,一个是宽度,还有一个是两个边界较矮的那个。宽度很好确定,可以从最大的开始,慢慢试。但是两个边界怎么移动?因为每次都是由矮的决定,所以移动数字较小的,直到遇到一个比之前的边界大的。2ms。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public int maxArea(int[] height) {
int i=0,j=height.length-1;
int result=0;
result=(j-i)*Math.min(height[j], height[i]);
int left=height[i],right=height[j];
while(i<j) {
if(height[i]<=height[j]) {
i++;
while(height[i]<=left&&i<j) {
i++;
}
left=height[i];
}else {
j--;
while(height[j]<=right&&i<j){
j--;
}
right=height[j];
}
result=Math.max(result, (j-i)*Math.min(left, right));
}
return result;
}

双指针。leetcode 9/100