题目链接
自己的思路
暴力解法,循环遍历i,j,计算出最大的储水量。
class Solution {
public int maxArea(int[] height) {
int len = height.length;
int ans = -1;
for(int i = 0; i < len ; i++){
for(int j = i + 1; j < len; j++){
int di = (j - i) * Math.min(height[i], height[j]);
ans = Math.max(ans, di);//以短的为基点
}
}
return ans;
}
}
但是明显这个是很慢的的,时间复杂度o(n^2)
正确答案
在初始时,左右指针分别指向数组的左右两端,它们可以容纳的水量为 min(1,7)∗8=8。
此时我们需要移动一个指针。移动哪一个呢?直觉告诉我们,应该移动对应数字较小的那个指针(即此时的左指针)。这是因为,由于容纳的水量是由
两个指针指向的数字中较小值∗指针之间的距离
决定的。如果我们移动数字较大的那个指针,那么前者「两个指针指向的数字中较小值」不会增加,后者「指针之间的距离」会减小,那么这个乘积会减小。因此,我们移动数字较大的那个指针是不合理的。因此,我们移动 数字较小的那个指针。
理解:我们需要移动较小值,因为我们移动较大值是没有意义的,储水量只跟较小值有关。
class Solution {
public int maxArea(int[] height) {
int len = height.length;
int ans = -1, num = 0;
int i = 0, j = len - 1;
while(i < j){
num = Math.min(height[i], height[j]) * (j - i);
ans = Math.max(ans, num);
if(height[j] < height[i])//往小的那边移动
j --;
else
i++;
}
return ans;
}
}