力扣热门100题——盛水最多的容器(暴力解法,双指针,贪心)

4、盛水最多的容器

1.问题描述

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

2.示例

示例 1:

力扣热门100题——盛水最多的容器(暴力解法,双指针,贪心)_第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.提示

n == height.length
2 <= n <= 10^5
0 <= height[i] <= 10^4

4.具体解法(暴力解法,双指针,贪心)

//方法一:暴力解法
//第一反应是,找两个最长的板子,那之间的水不就是最多,但示例的例子就可以提醒自己,这么想是不对的
//那么就想到暴力遍历的方式
//因为两块板子之间的盛水量,就是两块板子的距离乘上低板子的高度
//所以弄上一个双层for循环,做i和j的差值(不用再多减一,九个线,数组下标最大值正好是8,8-0正好是最大的距离8)
//差值乘height[i]和height[j]中的小者,存储到一个最大值变量中,最后返回即可。
//附上自己写的暴力循环,超出时间限制
//发现很多超出时间限制的,问题就在于,二层循环有很多冗余的操作,一般都是从这里入手去解决相关的问题
//自己应该去找到一个解决的思路,其实之前已经有了,只不过自己没去细致的掌握,应该掌握一下,可以做到一通百通,起码在暴力这一块,可以做到能用就能通过
/*
class Solution {
    public int maxArea(int[] height) {
        int maxsum=0;//最后返回的最大值
        int nowsum=0;//临时的最大值
        int len=height.length;
        for(int i=0;imaxsum){
                    maxsum=nowsum;//这里我想直接在那个答题界面用max方法,但是会报错,应该还是得导包才可以用
                                  //好像是因为我没有用类名直接调用,我直接写的方法名,少写了类名
                }
            }
        }
        return maxsum;

    }
}
 */

//暴力解法的改进
//解决办法就是对height[i]进行一个判断,只有大的才有机会留下,小的不可能容量更大了,所以直接都不判断了
/*
class Solution {
    public int maxArea(int[] height) {
        if(height.length==1||height.length==0){
            return 0;
        }
        int max=0;
        for(int i=1;imax/i)//注释掉这一句就会最后超时
                               //然后我把这一句给改成加个{}将后面的for包裹起来,也可以不超时
                               //我这样改的意义其实就是,如果这个height[i]比上一个更小,那肯定最大值还没有前面的那个做边的时候更大,直接跳过
            for(int j=0;j

5.收获

  • 发现很多超出时间限制的,问题就在于,二层循环有很多冗余的操作,一般都是从这里入手去解决相关的问题,自己应该去找到一个解决的思路,其实之前已经有了,只不过自己没去细致的掌握,应该掌握一下,可以做到一通百通,起码在暴力这一块,可以做到能用就能通过。自己试着去想了一下找二层循环的冗余部分,发现不是很容易就能想到呢
  • 双指针的思路好像也是经常使用的,可以避免一些重复的操作
  • max方法的调用时类名直接调用,静态类嘛。Math.max(a,b)即可
  • 即使是同样的算法,还能有不小的差别,其中的原因还是没有掌握,但是应该是跟底层的逻辑结构有关系
  • 对于双指针的解法,有贪心的说法,就是每一次都是把短的舍弃,这种贪心的做法,只有移动短的,才可能容量变大,思路都一样,就是说法不一样

你可能感兴趣的:(力扣刷题,java,力扣,算法)