盛最多水的容器

【题目描述】

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。

说明:你不能倾斜容器。

【示例 1】

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

【示例 2】

输入:height = [1,1]
输出:1

【代码实现】

1. 爆破大法除了会超出时间限制,其他都挺好用的。。。

 1 class Solution {
 2     public int maxArea(int[] height) {
 3         int area=0;
 4         int maxarea=0;
 5         for(int i=0;i<height.length;i++){
 6             for(int j=i+1;j<height.length;j++){
 7                 area=(j-i)*Math.min(height[i],height[j]);
 8                 if(area>maxarea){
 9                     maxarea=area;
10                 }
11             }
12         }
13         return maxarea;
14     }
15 }

2. 双指针

算法流程:
初始化: 双指针 ii , jj 分列水槽左右两端;
循环收窄: 直至双指针相遇时跳出;
更新面积最大值 resres ;
选定两板高度中的短板,向中间收窄一格;
返回值: 返回面积最大值 resres 即可;

 

执行用时:5 ms, 在所有 Java 提交中击败了15.05%的用户
内存消耗:51.8 MB, 在所有 Java 提交中击败了55.33%的用户
 1 class Solution {
 2     public int maxArea(int[] height) {
 3         int area=0;
 4         int maxarea=0;
 5         int i=0;
 6         int j=height.length-1;
 7         while(i<j){
 8             area=(j-i)*Math.min(height[i],height[j]);
 9             if(maxarea<area){
10                 maxarea=area;
11             }
12             if(height[i]<=height[j]){
13                 i++;
14             }else{
15                 j--;
16             }
17         }
18         return maxarea;
19     }
20 }

3. 双指针优化

执行用时:2 ms, 在所有 Java 提交中击败了98.80%的用户
内存消耗:51.2 MB, 在所有 Java 提交中击败了86.03%的用户
class Solution {
    public int maxArea(int[] height) {
        int area=0;
        int maxarea=0;
        int i=0;
        int j=height.length-1;
        while(i<j){
            int left = height[i];
            int right = height[j];
            area=(j-i)*Math.min(left,right);
            if(maxarea<area){
                maxarea=area;
            }
            if (left <= right) {
                while (left >= height[++i] && i < j) {
                }
            } else {
                while (right >= height[--j] && i < j) {
                }
            }
        }
        return maxarea;
    }
}

 

posted @ 2022-02-28 16:04  IcyYs  阅读(22)  评论(0编辑  收藏  举报