力扣[11]盛最多水的容器
题目
示例:输入:[1,8,6,2,5,4,8,3,7] 输出:49
题解1 思想:暴力枚举
用指针i代表左柱,用指针j代表右柱,指针i起始为0,指针j起始为1,i和j都向右走,穷举遍历每一个面积,直到找到最大的面积为止。代码如下:
int max = 0;
for (int i = 0; i < height.length - 1; i++) {
for (int j = i + 1; j < height.length; j++) {
int area = (j - i) * Math.min(height[i], height[j]);
max = Math.max(area, max);
}
}
return max;
此解法可以看出时间复杂度为O(n^2),故比较耗时
题解2 思想:左右夹逼
题解1中由于两个指针即左柱右柱都是由左向右进行移动来找寻面积最大值,那我们可以让左柱向右移动,右柱向左移动来找寻最大值,这样的话就只需要遍历一遍数组,显然,时间复杂度可以降低为O(n)。
分析:当左柱矮于右柱时,高度由左柱决定,右柱左移高度不可能增长,宽反而下降,故无需右柱左移动,即需左柱右移。同理,右柱矮于左柱时,为了使面积有可能增大,只能使右柱左移。代码如下:
int max = 0;
for (int i = 0, j = height.length - 1; i < j; ) {
//令高度为左柱和右柱中较矮的柱,若左柱较矮,则左柱同时向右移动,右柱雷同
int h = height[i] < height[j] ? height[i++] : height[j--];
//注意由于左右柱均有移动一位的操作,故求底宽时需要+1
max = Math.max(max, h * (j - i + 1));
}
return max;
题解2的时间复杂度为O(n)
对比题解1和题解2的执行时间,不难发现,题解2要快的很多,本题要尤其注意这正左右夹逼的思想!!!