每天一道算法题系列九之盛最多水的容器

每天一道算法题系列:
来源:力扣(LeetCode)
本题链接:https://leetcode-cn.com/problems/container-with-most-water/
来源是力扣,大家喜欢可以去力扣中文网做相应的其他的题,某浏览器直接搜力扣即可。
本题难度是中等

给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 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
示例 3:
输入:height = [4,3,2,1,4]
输出:16
示例 4:
输入:height = [1,2,1]
输出:2

package com.example.likou.likou2;
/*
这道题的做法,感觉这种题目一看到就是用暴力破解的方法,然后咔咔咔两个for循环下去,很完美。然后,发现运行有比较多的问题,但是这也是第一时间相当的方法,不是很完善,然后我再后面附上了另外一种简单的想法
*/
public class MaxArea {
    public static int maxArea1(int[] height) {
        int maxSize  = 0 ;
        int h = 0 ;
        int preSize ;
        for (int i = 0; i < height.length; i++) {
            for (int j =  0; j < height.length; j++) {
				/*
				这里主要是判断两个高,谁最高,然后取矮的那个为最后的高
				*/
                h = height[j] > height[i] ? height[i] : height[j];
                /*
				这里主要是计算面积
				*/
                preSize = h * (j-i) ;
                /*
				这里主要是判断最大的面积
				*/
                maxSize = maxSize > preSize ? maxSize :  preSize;
            }
        }
        

        return maxSize ;
    }

    public static void main(String[] args) {
        int[] array = {1,2,100,8,9};
        System.out.println(maxArea1(array));
    }
}

package com.example.likou.likou2;
/*
 这道题的做法,其实也是两个for循环的方式,然后不同的一点是,不是两个数都往上面加,而是一个家,一个减,叫做双指针模式。
 这里要明白的一点是,如果两个指针中间隔了一个长,然后高取两个指针中间的矮的,算出面积之后,只移动其中的一个指针,那么移动的指针肯定是低的那个指针,然后算出面积再比较。(可以想到,这样移动其实是合理的,因为面积是两数相乘,然后移动矮的那边后,肯定面积会小于移动大的那边的指针)
*/
public class MaxArea {
    public static int maxArea1(int[] height) {
        int maxSize  = 0 ;
        int h = 0 ;
        int preSize ;
        
        int i = 0;
        int j = height.length -1 ;
        while (i != j){
          /*
				这里主要是判断两个高,谁最高,然后取矮的那个为最后的高
				*/
                h = height[j] > height[i] ? height[i] : height[j];
                /*
				这里主要是计算面积
				*/
                preSize = h * (j-i) ;
                /*
				这里主要是判断最大的面积
				*/
                maxSize = maxSize > preSize ? maxSize :  preSize;
            if(height[j] > height[i]){
                i++;
            }else{
                j--;
            }
        }

        return maxSize ;
    }

    public static void main(String[] args) {
        int[] array = {1,2,100,8,9};
        System.out.println(maxArea1(array));
    }
}

上一篇文章:每天一道算法题系列八之回文数
请继续关注我,如果后面不忙了,会写一系列关于的设计模式的文章。
如果本篇内容有问题,请第一时间联系我,我会第一时间修改。
谢谢大家。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值