[leetcode刷题之旅]11.盛最多水的容器

题目链接

1、题目解析

在这里插入图片描述
根据图示可以看出,容积取决于两个条件,一是容器两边中最小边的长度,二是容器两边的距离,即底和高。因此我们需要计算的就是这两个数据。

因此在程序中我们需要设置的变量有:

  • 最大面积max(记录循环过程中产生的最大值)
  • 两个指向容器两端的指针(确定容器底边长度和高度)

2、实现代码

2.1暴力求解

根据题目含义,我们需要写出两重循环,遍历每一种可能的情况。

    public int maxArea(int[] height) {
        int area = 0;
        for (int i = 0; i< height.length - 1; i++){
            for(int j =i+1; j<height.length; j++){
                int new_area = Math.min(height[i],height[j]) * (j-i);
                area = Math.max(area,new_area);
            }
        }
        return area;
    }

运行结果
定义变量i,j从头开始依次对所有可能的情况进行遍历,这里要注意j要从i+1开始执行,因为容器的两端是不能重合的,同时i的循环是在数组的倒数第二个位置,j的循环是数组的最后一个位置。

2.2 双指针前后夹逼

    public int maxArea(int[] height) {
        int area = 0;
        for (int i = 0,j = height.length-1; i < j;) {
            int minHeight = height[i] < height[j] ? height[i++] : height[j--];
            int new_area = minHeight * (j - i + 1);
            area = Math.max(area,new_area);
        }
        return area;
    }

在这里插入图片描述
容器的底长度可以根据两个指针的距离差来计算,这里没有可以优化的地方,因此我们需要对高度的选择进行优化。

通过双指针前后夹逼的方式,只需要一次循环,时间复杂度为0(n)。

解题思路:比较两指针对应的长度,选取长度较短的一段作为高,同时对应的指针需要向其运动方向移动一格(i向右移,j向左移)。

在两端不断靠近的过程中,底边长度不断减小,而我们容器的判定还需要根据高度来决定,所有需要找到尽量高的边来弥补底边减少的带来的差距。

第一次写博文,写得不是很好,如有不足可以来跟我分享意见。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值