Leetcode 11. 盛最多水的容器

167 阅读3分钟

Leetcode 11. 盛最多水的容器

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

❤️‍欢迎订阅java厂长《LeetCode每日一题》 ❤️‍

1、题目📑

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0)(i, height[i])

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

实例1

img

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

提示

  • n == height.length
  • 2 <= n <= 105
  • 0 <= height[i] <= 104

2、思路🧠

假设两指针 i , j,指向水槽板高度分别为 h[i] , h[j] ,在此状态下水槽面积为 S(i, j)。但是清楚可容纳水的高度由两板中的 短板 决定,所以可得计算面积公式 :

S(i, j) = min(h[i], h[j]) × (j−i)

方法一

  1. 由于数据不具有单调性,故需遍历完整个数组。

  2. 初始化:

    • 定义i = 0j = n - 1
    • 每次计算盛水容量,对 ij 对应的数字中的更小的数向中间移动
  3. 循环遍历:

    • j < i 结束遍历

方法二:双指针

在每个状态下,无论长板或短板向中间收窄一格后,都会出现水槽 底边宽度 - 1 变短:

  • 如果是向内 移动短板 ,水槽的短板 min(h[i], h[j]) 可能变大,所以在下个水槽的面积 可能增大
  • 如果是向内 移动长板 ,水槽的短板 min(h[i], h[j]) 不变或变小,所以在下个水槽的面积 一定变小
  1. 初始化:

    • 用双指针 ij
  2. 循环遍历:

    • 选定两板高度中的短板,向中间收窄一格
  3. 返回最大的结果值。

废话少说~~~~~上代码!

3、代码👨‍💻

第一次commit AC

class Solution {
    public int maxArea(int[] height) {
        int ans = (int)-2e9;
        int n = height.length;
        
        int i = 0, j = n - 1;
        while (i < j) {
            int base = j - i;
            int h = Math.min(height[i], height[j]);
            int ml = base * h;
            ans = Math.max(ans, ml);
            if (height[i] <= height[j]) {
                i++;
            } else {
                j--;
            }              
        }
        return ans;
    }
}

时间复杂度:O(N)

空间复杂度:O(1)

第二次commit AC

class Solution {
    public int maxArea(int[] height) {
        int i = 0, j = height.length - 1, max = 0;
        while(i < j) {
            max = height[i] < height[j] ? 
                Math.max(max, (j - i) * height[i++]): 
                Math.max(max, (j - i) * height[j--]); 
        }
        return max;
    }
}

时间复杂度:O(N) 双指针遍历一次底边宽度 N

空间复杂度:O(1) i , j 都是常数级别。

image-20220529235222442

4、总结

该题目的对题目的解读能力以及对思维的考察,并且能够想到具体问题具体解决。

❤️‍来自专栏《LeetCode基础算法题》欢迎订阅❤️‍

厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。

对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!

原题链接:11. 盛最多水的容器 - 力扣(LeetCode)