题目链接11. 盛最多水的容器 - 力扣(LeetCode)
1.常规解法(会超时)
采用双层遍历来遍历这个数组,求出每一次的盛水量,最后返回最大的盛水量,代码如下:
public int maxArea(int[] height) {
int maxVolume = 0;
for (int i = 0; i < height.length - 1; i++) {
for (int j = i + 1; j < height.length; j++) {
maxVolume = Math.max(maxVolume, Math.min(height[i], height[j]) * (j - i));
}
}
return maxVolume;
}
2.双指针算法
该算法使用了单调性的思想
定义两个指针left和right,left指向数组首元素。right指向数组最后一个元素,先求出left和right之间能盛多少水,再比较left和right指向的值,若left指向的值小于right指向的值,根据木桶效应(一个水桶能盛的最多的水取决于最短的那根木板)那么right左边的值由于木板长度不会变大(最大就是left指向的值),而且由于单调性,left与right之间的距离也会缩短,就导致之后盛的水一定没有当前left位置盛的水多,那么就应该向又移动left,以改变木板的最短长度;同理,若right指向的值小于left指向的值,那么left右边的木板与right盛的水一定没有当前多,那么就需要向左移动right,以改变木板最短长度,流程图如下:
代码如下:
public int maxArea(int[] height) {
int left = 0;
int right = height.length - 1;
int maxVolume = 0;
while (left < right) {
maxVolume = Math.max(maxVolume, Math.min(height[left], height[right]) * (right - left));
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return maxVolume;
}