(五)盛最多水的容器

题目:给定一个长度为 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); // 打印最大水容量
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值