题目
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
分析
- 暴力会超时
- 通过双指针,从两端遍历
- 计算出初试的最大容量sum
- height值小的指针移动,每移动一次重新计算当前指针位置的最大容量sum
- 和max比较,迭代到最后max就是最大容量
代码
class Solution {
public int maxArea(int[] height) {
int left = 0;
int right = height.length - 1;
int len = height.length -1;
int max = len * Math.min(height[left], height[right]);
int sum = max;
while (left < right) {
int min = Math.min(height[left], height[right]);
if (min == height[left]) {
left++;
} else {
right--;
}
len--;
sum = len * Math.min(height[left], height[right]);
max = Math.max(max,sum);
}
return max;
}
}
class Solution {
public int maxArea(int[] height) {
int i = 0, j = height.length - 1, max = 0;
while(i < j) {
max = height[i] < height[j] ?
Math.max(max, (j - i) * height[i++]):
Math.max(max, (j - i) * height[j--]);
}
return max;
}
}