LeetCode11:盛最多水的容器
给定一个长度为 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.length
思路分析
双指针移动,左指针为i,右指针为j 初始化为i=0,j=length-1;length为数组的长度 面积起始已经出来了 就是i与j围成的 如果左边比右边高度矮,每次保留最高可以保证下一次求得的面积是某种意义的最大值 其实就是求的这么多次肯定把最大面积包括进去了,然后通过max取最大值
- 定义两个指针i,j,分别首尾位置相对移动
- 定义变量
maxVolume表示所求的最大值
算法代码
public int maxArea(int[] height) {
int length = height.length;
//存最大值
int max = 0;
//两个指针分两边,每次求的面积就是i与j之间的面积,
//当然 高度是最小的那一个,,
for (int i = 0, j = length - 1; i < j;) {
//如果左边的高度比右边大,我们就移动右边j--;
//因为这样左边大我们就可以找出最大值,
if (height[i] > height[j]) {
//存值,存i与j之间的面积
max = Math.max(max, (j - i) * height[j]);
//左边
j--;
} else {
//与上同理
max = Math.max(max, (j - i) * height[i]);
//存值,存i与j之间的面积
i++;
}
}
return max;
}
结果详情
算法复杂度
- 空间复杂度:
- 时间复杂度:
在掘金(JUEJIN)一起进步,一起成长!