Problem: 11. 盛最多水的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
思路
- 看到题目首先想到的解法是直接使用暴力,枚举所有边的组合情况然后返回最大的容积。
- 是否可以简化呢,例图当前的容积v = dis * Math.min(a, b), 两个边的较小值 * 两个边的距离,如果两个边靠近dis的值就变小,如果要找到更大的v值则要变大Math.max(a, b)要这个值变大就需要,a的较小值变大
- 具体步骤a为最左边的边,b为最右边的边,两个边向中间移动,每次移动a 和b的较小值,每次移动更新一下结果值
复杂度
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( 1 ) O(1) O(1)
Code
class Solution {
public int maxArea(int[] height) {
int res = 0;
int left = 0, right = height.length - 1;
while (left < right) {
int a = height[left], b = height[right];
res = Math.max(res, Math.min(a, b) * (right - left));
if (a < b) {
left++;
} else {
right--;
}
}
return res;
}
}
func maxArea(height []int) int {
res := 0
left := 0
right := len(height) - 1
for left < right {
a := height[left]
b := height[right]
area := 0
if a < b {
area = a * (right - left)
left++
} else {
area = b * (right - left)
right--
}
if area > res {
res = area
}
}
return res
}