• 盛最多水的容器


    暴力题解:双重for循环,时间复杂度O(n^2)

    class Solution {
        public int max(int a,int b){
            if(a>=b) return a;
            return b;
        }
        public int min(int a,int b){
            if(a>=b) return b;
            return a;
        }
        public int maxArea(int[] height) {
            int n=height.length;
            int res=0;
            for(int i=0;i<n;i++){
                for(int j=i+1;j<n;j++){
                    res=max((j-i)*min(height[i],height[j]),res);
                }
            }
            return res;
       
        }
    }
    
    

    双指针:时间复杂度O(n)

    一个指针指向开头,一个指向结尾,此时容器的底最大,当移动指针不管是左指针往右移动还是右指针往左移动都会使底-1,那么如何选择?

    此时我们应该保持容器的高尽可能地大,所以当左指针指向的值小,左指针向右移动一个,同理,当右指针指向的值小,右指针向左移动一个。

    class Solution {
        public int maxArea(int[] height) {
         int i = 0,j = height.length-1;
         int ans = 0;
         while(i < j){
             ans =  Math.max(ans,(j - i)*Math.min(height[i],height[j])) ;
             if(height[i] >= height[j]) j--;
             else   i++;
             }
             return ans;
         }
    }
    
    
  • 相关阅读:

    (luogu)[模板]最长公共子序列
    表达式的值
    邮票面值设计
    尼克的任务
    HISTOGRA
    消防局的设立
    青蛙的约会
    产生数
    奇怪的电梯
  • 原文地址:https://www.cnblogs.com/cstdio1/p/13410342.html
Copyright © 2020-2023  润新知