zoukankan      html  css  js  c++  java
  • 011 Container With Most Water 盛最多水的容器

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

    详见:https://leetcode.com/problems/container-with-most-water/description/

    实现语言:Java

    方法一:暴力解,超时

    class Solution {
        public int maxArea(int[] height) {
            int size=height.length;
            if(size<2){
                return 0;
            }
            int maxArea=0;
            for(int i=0;i<size;++i){
                for(int j=i+1;j<size;++j){
                    int area=height[i]<height[j]?height[i]*(j-i):height[j]*(j-i);
                    if(area>maxArea){
                        maxArea=area;
                    }
                }
            }
            return maxArea;
        }
    }
    

     方法二:时间复杂度:O(n),空间复杂度:O(1)

    从第一个高度为起始容器壁,以最后一个高度为终止壁,如果a1 <= an,那么以a1为起始的容器最大是a1 * (n - 1),以a1为容器壁的最大容器计算出来的。那么以a1为壁的所有情况不需要再考虑,接着考虑a2的;同理,如果a1 > an,an不再考虑,考虑an-1,这有点类似"夹逼定理"。比较ai和aj(i<j)如果ai <= aj,i++;否者j ++直到i == j。这个算法的时间复杂度是(O(n))。

    class Solution {
        public int maxArea(int[] height) {
            int size=height.length;
            if(size<2){
                return 0;
            }
            int maxArea=0;
            int start=0;
            int end=size-1;
            while(start<end){
                maxArea=Math.max(maxArea,Math.min(height[start],height[end])*(end-start));
                if(height[start]<height[end]){
                    ++start;
                }else{
                    --end;
                }
            }
            return maxArea;
        }
    }
    
  • 相关阅读:
    Java上等价类划分测试的实现
    软件测试の因果图法的测试运用
    display: block; 和 display: inline; 的区别
    CSS实现垂直居中
    CSS中实现水平居中
    HTTP头部信息
    HTTP PUT方法和POST方法的区别
    理解 ajax xhr jsonp
    深入理解JavaScript系列
    Angular 1.x 指令笔记
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8683148.html
Copyright © 2011-2022 走看看