算法十一:盛最多水的容器

前言

这几天一直没写博客,由于每次算法题几乎都是穷举暴力解决,在观看别人的算法思想时,发现很多人都在用动态规划等算法思想。动态规划看起来简单,但编者在一些地方还是考虑不周到。故这几天一直在看动态规划和以前做过的算法题。这里直接跳过算法十,是由于算法十的一些地方理解不够清晰,待理解透彻时会更新。
程序员搞笑图片

算法内容

给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/container-with-most-water
示例

算法思想

这里编者简单说一下以下两种算法思想:

  1. 穷举算法思想:这是大部分看到这道题的第一算法思想,将每种情况考虑到,并将每种情况比较,取其最大,这里的主要代码不在这里详述。
  2. 优化算法思想:同时定义height数组两边i=0,j=height.length-1;定义一个变量记录最大值max,定义一个变量记录i与j之间的长度len,定义宽的长度为wid。(初始状态:max=0)
len=j-i;
if height[i]<height[j]{
    
    
    wid=height[i]
}
max= max>(len*wid) ? max:(len*wid)

整体算法

  • 穷举算法
public class Day_11 {
    
    
    public static int maxArea(int[] height) {
    
    
        int sunNum=0;
        int sunMun=0;
        int count=0;
        int countNum=0;
        for (int i = 0; i < height.length; i++) {
    
    
            for (int j = i+1; j < height.length; j++) {
    
    
                sunMun=j-i;
                if(height[j]<=height[i]){
    
    
                    sunNum=height[j];
                }else{
    
    
                    sunNum=height[i];
                }
                countNum=sunMun*sunNum;
                if (count<countNum){
    
    
                    count=countNum;
                }
            }
        }
        return count;
    }

    public static void main(String[] args) {
    
    
        Scanner input=new Scanner(System.in);
        int j=0;
        //输入数据
        String day_11_num=new String();
        day_11_num=input.nextLine();
        //去掉[,]两符号
        String day_11_search=new String();
        for (int i = 1; i < day_11_num.length()-1; i++) {
    
    
            day_11_search+=day_11_num.charAt(i);
        }
        //根据逗号拆分字符串
        String [] day_11_Truenum=day_11_search.split(",");
        int [] day_11_int=new int[day_11_Truenum.length ];
        //将字符串数组转换为数字数组
        for (int i = 0; i <day_11_Truenum.length ; i++,j++) {
    
    
            day_11_int[j]=Integer.valueOf(day_11_Truenum[i]);
        }
        System.out.println(maxArea(day_11_int));
    }
}
  • 优化算法
public class Day_11_ag {
    
    
    public static int maxArea(int[] height){
    
    
        int max=0;
        int len;
        int wid;
        int i=0;
        int j=height.length-1;
        while (i!=j){
    
    
            wid=j-i;
            if(height[i]<height[j]){
    
    
                len=height[i];
                i++;
            }else{
    
    
                len=height[j];
                j--;
            }
            max= max>(len*wid) ? max:(len*wid);
        }
        return max;
    }
    public static void main(String[] args) {
    
    
        Scanner input=new Scanner(System.in);
        int j=0;
        //输入数据
        String day_11_num=new String();
        day_11_num=input.nextLine();
        //去掉[,]两符号
        String day_11_search=new String();
        for (int i = 1; i < day_11_num.length()-1; i++) {
    
    
            day_11_search+=day_11_num.charAt(i);
        }
        //根据逗号拆分字符串
        String [] day_11_Truenum=day_11_search.split(",");
        int [] day_11_int=new int[day_11_Truenum.length ];
        //将字符串数组转换为数字数组
        for (int i = 0; i <day_11_Truenum.length ; i++,j++) {
    
    
            day_11_int[j]=Integer.valueOf(day_11_Truenum[i]);
        }
        System.out.println(maxArea(day_11_int));
    }
}

尾语

以上属于个人见解,有好的想法可以在下方评论写出自己的想法,大家一起进步。该题是力扣上的题,若有侵权,请及时告知。该题链接:https://leetcode-cn.com/problems/container-with-most-water

猜你喜欢

转载自blog.csdn.net/weixin_40741512/article/details/113186333
今日推荐