题目描述
给定一个长度为 n 的整数数组 height 。
有 n 条垂线,
第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
提示:
- n == height.length
题目解析
本题利用双指针解决。那么引申出两个问题
- 如何利用双指针解决问题
- 双指针解决——为什么是对的,如何证明?
双指针解题思路过程验证
- 初始化数组的左右边界为左右指针,那么计算出
盛水量 = min(height[left], height[right]) * (right - left)
- 很显然,左右指针谁指向的元素值更小,应该移动谁
- 为什么?
- 因为盛水量的多少取决于较短的一条边
- 所以移动较短的一条边,才有可能找到更多的盛水方案
- 如果左右两边高度相同
- 那么可以随意移动其中一条边
- 计算盛水量始终取决于较短的边,所以任意移动左右指针之后,计算出的面积不会大于移动之前
- 因为其底部长度减少了.
show code
class Solution {
public int maxArea(int[] height) {
int n = height.length;
int left = 0,right = n - 1;
int ans = 0;
while(left < right) {
// 底边长度计算.
int rSide = right - left;
// 计算得出较短的边.
int hSide = Math.min(height[left], height[right]);
// 计算盛水量.
ans = Math.max(ans, rSide * hSide);
if(height[left] < height[right]) {
left++;
} else {
right--;
}
}
return ans;
}
}
标签:11,leet,right,int,height,ans,最多水,指针,left
From: https://blog.51cto.com/u_16079703/8033675