文章目录
11. 盛最多水的容器
本题颇有短板效应的感觉。
自己想的算法也AC了,这里都记录下来。
一个是双指针算法,一个是优化有的双循环算法,都可以AC。
双指针算法。
短板效应
短板效应,即桶之间的水取决于较短的那个板子。
考虑左右指针l 和 r,l向右移, r 向左移,所以l 和 r边界是逐渐缩小的,唯一能做的就是让height[l]和height[r],即这个板子长一点。
考虑如下情景:
如果此时的板子一边长,一边短,是该移动长的还是短的还是随机?
答案是移动短的
因为就算是移动长的,能装的水也一定不会变多
为什么一定不会变多?
因为不管移动长的还是短的,左右边界是逐渐往里收缩越靠越近的。所以边界会变小。那往里的时候遇到一个非常大的数呢?
eg: 1 2 2000 3
对于上面的例子而言,如果移动3到2000的位置,能乘多少水呢?
1和2000的板子,那也是短板效应,也是看1,所以边界小了,两端的值也没有变大。血亏
所以上面的答案就出来了,移动短的,这时才有可能让能乘的水可能变多。
所以大体的思路是
设置双指针l 和 r,然后在当前位置计算一下能存的水,然后比较一下height[l]和height[r]哪个大。将小的那个向中间移动就可以。
ACCode
class Solution {
public int maxArea(int[] height) {
int n = height.length, l = 0, r = n - 1;
int res = 0;
while