Leetcode 11. 盛最多水的容器
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情。
1、题目📑
给定一个长度为 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
提示:
n == height.length2 <= n <= 1050 <= height[i] <= 104
2、思路🧠
假设两指针 i , j,指向水槽板高度分别为 h[i] , h[j] ,在此状态下水槽面积为 S(i, j)。但是清楚可容纳水的高度由两板中的 短板 决定,所以可得计算面积公式 :
方法一:
-
由于数据不具有单调性,故需遍历完整个数组。
-
初始化:
- 定义
i = 0,j = n - 1 - 每次计算盛水容量,对
i和j对应的数字中的更小的数向中间移动
- 定义
-
循环遍历:
- 当
j < i结束遍历
- 当
方法二:双指针
在每个状态下,无论长板或短板向中间收窄一格后,都会出现水槽 底边宽度 - 1 变短:
- 如果是向内 移动短板 ,水槽的短板
min(h[i], h[j])可能变大,所以在下个水槽的面积 可能增大 - 如果是向内 移动长板 ,水槽的短板
min(h[i], h[j])不变或变小,所以在下个水槽的面积 一定变小
-
初始化:
- 用双指针
i,j
- 用双指针
-
循环遍历:
- 选定两板高度中的短板,向中间收窄一格
-
返回最大的结果值。
废话少说~~~~~上代码!
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 都是常数级别。
4、总结
该题目的对题目的解读能力以及对思维的考察,并且能够想到具体问题具体解决。
❤️来自专栏《LeetCode基础算法题》欢迎订阅❤️
厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。
对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!