11. 盛最多水的容器
题目地址:https://leetcode-cn.com/problems/container-with-most-water/
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
考查点:双指针 数组
思路:使用双指针解决问题,初始化时,我们设置左右两个指针分别指向数组的头和尾,此时两个指针对应值围成的面积为值较小的一边的值乘以两个指针对应的长度即min(a0,a8)*(tail-head),然后我们将值较小的一边向内收敛,即左指针向右移,然后再次计算面积。依次反复得到最大值
步骤
-
创建int类型变量max作为最大面积,初始值为0 (int max = 0;)
-
设置左右指针(head和tail)分别指向数组的头和尾,
-
当 head 指针处于tail指针的左边时(head < tail),进行循环
- 计算此时两个指针围成的面积,两个指针围成的面积等于对应数字较小的指针乘以两个指针之间的距离 (int area = Math.min(height[head],height[tail]) * (tail - head);
- 得到的面积area与max比较,若area较大,则将area赋值给max,否则max不变 max = Math.max(max,area);
- 然后比较两个指针对应的数值,若左指针值较小则左指针右移(head++),若右指针较小,则右指针左移(tail–)
- 直到左指针大于右指针或者左右指针重合,循环结束
-
返回max,结束
代码:
class Solution {
public int maxArea(int[] height) {
int max = 0;
int head = 0;
int tail = height.length - 1;
while (head < tail) {
int area = Math.min(height[head],height[tail]) * (tail - head);
max = Math.max(max,area);
if (height[head] < height[tail]){
head++;
}else {
tail--;
}
}
return max;
}
}