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
方法一:暴力解,超时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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))。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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; } } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步