leetcode011 (双指针) 盛最多水的容器

11. 盛最多水的容器

难度中等

给你 n 个非负整数 a<sub>1</sub>,a<sub>2,</sub>...,an每个数代表坐标中的一个点 (i, a<sub>i</sub>) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, a<sub>i</sub>)(i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器。

示例 1:

image

输入:[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

示例 3:

输入:height = [4,3,2,1,4]
输出:16

示例 4:

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

提示:

  • n = height.length
  • 2 <= n <= 3 * 10<sup>4</sup>
  • 0 <= height[i] <= 3 * 10<sup>4</sup>

My solution(暴力法)

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

执行用时:956 ms, 在所有 Java 提交中击败了10.46%的用户
内存消耗:39.8 MB, 在所有 Java 提交中击败了83.87%的用户
时间复杂度O(n^2)
空间复杂度O(1)

双指针法

public class Solution2 {
    public int maxArea(int[] height){
        int ans=0;
        for(int i=0,j=height.length-1;i<j;)
        {
            if(Math.min(height[i],height[j])*(j-i)>ans)
                ans=Math.min(height[i],height[j])*(j-i);
            if(height[i]>height[j])
                j--;
            else
                i++;
        }
        return ans;
    }
}

执行用时:3 ms, 在所有 Java 提交中击败了91.52%的用户
内存消耗:39.8 MB, 在所有 Java 提交中击败了78.21%的用户
时间复杂度O(n)
空间复杂度O(1)

作者:jyd
链接:https://leetcode-cn.com/problems/container-with-most-water/solution/container-with-most-water-shuang-zhi-zhen-fa-yi-do/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容