基础知识要求:
Java: 方法、Math.max()、while循环、数组、if else语句、算术运算符、自增自减运算符
Python: 方法、max()、while循环、列表、if else语句、算术运算符
题目:
给定一个长度为 n
的整数数组 height
。有 n
条垂线,第 i
条线的两个端点是 (i, 0)
和 (i, height[i])
。
找出其中的两条线,使得它们与 x
轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
示例 1:
输入:[1,8,6,2,5,4,8,3,7] 输出:49 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:
输入:height = [1,1] 输出:1
提示:
n == height.length
2 <= n <= 105
0 <= height[i] <= 104
思路解析:
为了找到能够容纳最多水的两条线,我们可以使用双指针的方法。双指针分别从数组的两端开始,向中间移动。
- 假设两个指针分别指向数组中的两个元素
height[left]
和height[right]
,其中left = 0
,right = n - 1
,n
是数组的长度。 - 当前容器的宽度是
right - left
,高度是min(height[left], height[right])
(因为容器的高度受限于两条线中较短的那条)。 - 我们可以计算当前容器的容量
area = (right - left) * min(height[left], height[right])
。 - 然后,我们需要决定移动哪个指针。显然,我们应该移动指向较短线的那个指针,因为移动指向较长线的指针不会增加容器的容量(容器的容量受限于较短的那条线的高度),而且容器的宽度还会减小。
- 我们重复这个过程,直到两个指针相遇为止。
Java代码示例:
public class MaxWaterContainer {
/**
* 计算整数数组中两条线可以构成的最大容器水量
*
* @param height 整数数组,表示每条线的高度
* @return 最大容器水量
*/
public static int maxArea(int[] height) {
int left = 0; // 左指针,从数组开始处
int right = height.length - 1; // 右指针,从数组末尾处
int maxArea = 0; // 用来记录最大容器水量的变量
// 当左指针小于右指针时,继续循环
while (left < right) {
// 计算当前左右指针所指向的线构成的容器水量
int currentArea = Math.min(height[left], height[right]) * (right - left);
// 更新最大容器水量
maxArea = Math.max(maxArea, currentArea);
// 如果左指针指向的线更短,则移动左指针
if (height[left] < height[right]) {
left++;
}
// 否则,移动右指针
else {
right--;
}
}
// 返回最大容器水量
return maxArea;
}
public static void main(String[] args) {
// 示例数组,表示每条线的高度
int[] height = {1, 8, 6, 2, 5, 4, 8, 3, 7};
// 调用maxArea方法计算并打印最大容器水量
System.out.println("Maximum water container capacity: " + maxArea(height));
}
}
在上面的代码中,maxArea
方法接受一个整数数组height
作为输入,并使用双指针技巧来计算最大容器水量。left
指针从数组的开始处开始,right
指针从数组的末尾开始。在每次迭代中,它都计算当前指针所指向的两条线形成的容器的面积,并更新maxArea
变量以存储迄今为止找到的最大面积。然后,它根据当前左右指针所指向的高度来决定移动哪个指针。最后,它返回计算得到的最大容器水量。
在main
方法中,我们创建了一个示例数组height
并调用了maxArea
方法来计算并打印最大容器水量。
Python代码示例:
def maxArea(height):
"""
计算整数数组中两条线可以构成的最大容器水量
参数:
height (list[int]): 整数数组,表示每条线的高度
返回:
int: 最大容器水量
"""
left, right = 0, len(height) - 1 # 初始化双指针,左指针指向数组起始位置,右指针指向数组末尾位置
max_area = 0 # 初始化最大容器水量为0
while left < right: # 当左指针小于右指针时循环继续
# 计算当前左右指针所指向的线构成的容器水量
area = (right - left) * min(height[left], height[right])
# 更新最大容器水量
max_area = max(max_area, area)
# 移动指向较短线的指针
if height[left] < height[right]: # 如果左指针指向的线更短
left += 1 # 则移动左指针
else: # 否则
right -= 1 # 移动右指针
return max_area # 返回最大容器水量
# 示例
height = [1, 8, 6, 2, 5, 4, 8, 3, 7] # 给定的整数数组
print(maxArea(height)) # 调用maxArea函数并打印结果,输出应为49