zoukankan      html  css  js  c++  java
  • 盛最多的水

    image-20200502172416383

    暴力求解

    public int maxArea(int[] heights){
        int max=0,temp=0,len=height.length;
        for(int i=0;i<len;i++){
            for(int j=i+1;j<len;j++){
                temp=(j-i)*Math.min(height[i],height[j]);
                max=Math.max(max,temp);
            }
        }
        return max;
    }
    

    优化

    解题思路

    • 准备两个指针,一个指向开头,一个指向结尾,此时容器的底最大的
    • 随着指针向内移动,会造成容器的底变小,在这种情况下想让容器盛水变多,就只能在容器的嗷下功夫。
    • 那我们如何决策哪个指针移动呢?我们能够发现不管是左指针向右移一位,还是右指针想左移一位,容器的底都是一样的,都比原来减少了1。
    • 这种情况下我们想要让指针移动后的容器面积增大,就要使移动后的容器的高尽量大,所以我们选择所指的高较小的那个指针进行移动,这样我们就保留了容器较高的那条边,放弃了较小的那条边,以获得更高的边的机会

    代码

    public int maxArea(int[] heights){
        if(height==null||height.length==0) return -1;
        int i=0,j=heights.length-1,ans=0;
        while(i<j){
            int h=Math.min(heights[i],heights[j]);
            ans=Math.max(ans,h*(j-i));
            if(heights[i]<heights[j]){
                i++;
            }else{
                j--;
            }
        }
        return ans;
    }
    
  • 相关阅读:
    Kvm --01 虚拟化基础概念
    Git--09 创建Maven项目
    Git--08 Jenkins
    Git--07 Gitlab备份与恢复
    Git --06 Git-gui安装
    Git --05 Gitlab使用
    Git--04 Github使用
    socket 释放全过程
    动态规划习题总结
    linux heap堆分配
  • 原文地址:https://www.cnblogs.com/yh-simon/p/12818810.html
Copyright © 2011-2022 走看看