题目:给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
题目释义:就是给你一组数组,数组元素中的值放在坐标系的x轴上,元素的值就是纵轴高度,找出相对来说最高的两条线(即两个元素)且他们之间的距离也相对最远,这样的话,容器的容积就是,两条线的最低值(这里为什么说是最低值,有点类似于一个木桶,想知道他能装多少水,不能看它最高的那块板子,而要看他最低的那块板子)乘以两条线之间的距离,也就是这个容器能装水的最大体积。
这里想要说明的是,为什么要用双指针,找出一个最大的不就确定好了一条边嘛,其实并不是这样,请看图二,最大容积是两个高度为2的线,2*5=10
图一
图二
经过上面的题目释义,首先看到这道题我的想法就是需要循环,两个指针,容器盛水问题是一个经典的双指针问题,需要找出两条垂直线段,与 x 轴共同构成一个容器,使得容器可以容纳最多的水。
以下就是这个问题的详细代码:
public class Solution {
// 定义一个方法用于计算最大的水容量
public int maxArea(int[] height) {
int max = 0; // 存储最大水容量的变量
int left = 0; // 指向数组左边的指针
int right = height.length - 1; // 指向数组右边的指针
// 使用双指针法来找到最大的水容量
while (left < right) {
int h = Math.min(height[left], height[right]); // 找到两端较短的垂线高度
int width = right - left; // 计算两垂线之间的距离,即容器的宽度
int area = h * width; // 计算容器的容积
max = Math.max(max, area); // 更新最大容积
// 移动较短垂线的指针,以寻找可能的更大容积
if (height[left] < height[right]) {
left++; // 向右移动左指针
} else {
right--; // 向左移动右指针
}
}
return max; // 返回最大容积
}
public static void main(String[] args) {
int[] height = {1, 8, 6, 2, 5, 4, 8, 3, 7}; // 给定的垂线高度数组
Solution solution = new Solution(); // 创建 Solution 类的实例
int maxWater = solution.maxArea(height); // 调用 maxArea 方法计算最大水容量
System.out.println("最大的水容量为: " + maxWater); // 打印最大水容量
}
}