11. 盛最多水的容器

题目链接:力扣

 

给定一个长度为 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

package 算法.数组.a11;

public class 盛最多水的容器 {
    public static void main(String[] args) {
        System.out.println(maxArea(new int[]{1,8,6,2,5,4,8,3,7}));
    }
    public static int maxArea(int[] height) {
        int l=0;//这是左指针
        int r=height.length-1;//这是右指针
        int sum=0;//假设最大最初为0
        while(l<r){//当左指针小于右指针,进入循环
            sum = height[l]<height[r] ?//谁值小,移动谁
                    Math.max(sum,(r-l)*height[l++]):
                    Math.max(sum,(r-l)*height[r--]);//注意这里是--
        }
        return sum;
        //双层循环,把所有面积求出来,把最大面积输出
//         //面积:长x高 (j-i) x (小的数)
//         int max = 0;//假设面积最大为0
//         int sum;
//         for(int i=0;i<height.length;i++){
//             for(int j=i+1;j<height.length;j++){
//                 if(height[i]<height[j]){
//                     sum = height[i]*(j-i);
//                 }else{
//                     sum = height[j]*(j-i);
//                 }
//                 if(sum>max){
//                     max = sum;
//                 }
//             }
//         }
//         return max;
     }
}

注意:使用双重for循环会超出时间限制

            所以,可以使用双指针。左指针、右指针一起移动,移动的时候谁的值小移动哪边。因为在两个边高度不变时,把高的移到中间,面积会越来越小(因为面积的高由低的一边决定);而把低的往中间移动,还有面积变大的可能;所以每次移动低的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值