题目描述
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
考察点
第一次:2022年12月14日11:22:46
经典的双指针的解题思路
由于容纳的水量是由 两个指针指向的数字中较小值 * 指针之间的距离;
那么,如何移动指针呢?移动数字较小的那个指针
。
为什么保证这个双指针得到的最优解是本题的最优解?,可以查看官方的证明。
代码展示
class Solution {
public int maxArea(int[] height) {
int result = 0;
int i = 0;
int j = height.length - 1;
while (i < j) {
int cur = Math.min(height[i], height[j]) * (j -i);
result = Math.max(cur, result);
if (height[i] <= height[j]){
i++;
}else {
j--;
}
}
return result;
}
}
2023-8-25 09:18:18
第二次了,还是想到了两层for循环。超时了。Orz
附上双指针的代码实现
class Solution {
public int maxArea(int[] height) {
int i= 0, j = height.length -1, res = 0;
// 两指针 i j 相遇时跳出循环
while(i < j){
// 移动短板
// i是短板的话, (j - i ) * height[i] 得到最新的面积, 并与当前最大面积比较,取最大的一个作为当前最大面积,并下标向右移动一次
// j是短板的话, (j - i ) * height[j] 得到最新的面积, 并与当前最大面积比较,取最大的一个作为当前最大面积,并下标向左移动一次
res = height[i] < height[j]?
Math.max(res, (j - i ) * height[i++]):
Math.max(res, (j - i ) * height[j--])
}
return res;
}
}
作者:Krahets
链接:https://leetcode.cn/problems/container-with-most-water/solutions/11491/container-with-most-water-shuang-zhi-zhen-fa-yi-do/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。