11. 盛最多水的容器 - 力扣(LeetCode)

本文介绍了如何使用Java和Python编程语言解决一个关于寻找两个垂直线段构成的容器能容纳最多水的问题,通过双指针策略计算最大水量。给出了详细的代码示例和思路解析。
摘要由CSDN通过智能技术生成

基础知识要求:

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 = 0right = n - 1n 是数组的长度。
  • 当前容器的宽度是 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

 

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千小凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值