【算法训练】LeetCode#11 盛最多水的容器.md
一、描述
11. 盛最多水的容器
给定一个长度为 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
二、思路
看到这道题,有一个好消息一个坏消息。
- 好消息:前天笔试遇到这道题了;
- 坏消息:先在笔试上遇到的,然后才在力扣上看到。/(ㄒoㄒ)/~~
这道题其实跟之前的一道hard难度的接雨水异曲同工,只是接雨水比这个考虑的情况更多,这道题用接雨水的思维做应该就可以了(但是笔试的时候没时间思考....就直接硬解了)。
双指针控制矩形边界不断求围成的面积,返回最大值。
指针移动时,选择高度较小的一侧向高度较大的一侧移动,这是因为较小侧的高度已经不可能成为更大矩形面积的边界了:
三、解题
public class LeetCode11 {
public int maxArea(int[] height) {
int left = 0;
int right = height.length - 1;
int ans = 0;
while (left != right){
int area = Math.min(height[left],height[right]) * (right-left);
ans = Math.max(area,ans);
if (height[left] <= height[right]){
left++;
} else {
right--;
}
}
return ans;
}
}