<LeetCode>盛最多水的容器

题目

盛最多水的容器

在这里插入图片描述

思路及代码

思路1 暴力循环(数组元素过多会超时)

(1)从第一个元素开始到倒数第二个元素都有机会作为容器的左壁高度
for(int i=0;i<height.length-1;i++)

(2)从该元素的下一个元素开始一直到最后一个元素,都有机会作为容器的右壁高度
for(int j=i+1;j<height.length;j++)
(3)选取左壁和右壁较低的作为当前形成的容器的高度,选择左壁与右壁之间的的距离作为容器底的长度,即可计算容器可盛水量
int len=j-i;
int curWater=Math.min(height[i],height[j])*len;
(4)将当前容器可盛水量与已得到的最大可盛水量比较,看是否需要进行最大可盛水量的更新
maxWater=maxWater<curWater?curWater:maxWater;

class Solution {
    public int maxArea(int[] height) {
		
		//保存已求得的可容纳的最多的水
        int maxWater=0;

		//遍历数组元素,每次选取一个元素作为左边的端点
        for(int i=0;i<height.length-1;i++)
        {
        	//从下一个位置开始,将每个元素都作为右边的端点,然后求此时可容纳的水的面积
            for(int j=i+1;j<height.length;j++)
            {
            	//容器底的长度
                int len=j-i;
                //容器的高选取左右端点较小的那个
                int curWater=Math.min(height[i],height[j])*len;
                maxWater=maxWater<curWater?curWater:maxWater;
            }
        }

        return maxWater;
    }
}

思路2 双指针——移动短板向内

创建两个指针,指针i指向容器左壁,指针j指向容器右壁,计算容器可盛水量,然后对指针进行移动,移动指针的条件如下

移动短板向内或移动长版向内,容器底的长度都会缩短
(1)移动短板向内,短板可能会变大,此时盛水量可能增大可能减小
(2)移动长板向内,短板可能不变或变小,此时盛水量必然减小

因此移动短板向内

class Solution {
    public int maxArea(int[] height) {
        int i=0,j=height.length-1;
        int maxWater=0;
        while(i<j)
        {
            int curWater=Math.min(height[i],height[j])*(j-i);
            maxWater=maxWater<curWater?curWater:maxWater;
            //移动短板向内或移动长版向内,容器底的长度都会缩短
            //但是移动短板向内,短板可能会变大
            //而移动长板向内,短板可能不变或变小,因此移动短板向内
            if(height[i]<height[j])
                i++;
            else
                j--;
        }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值