★11. 盛最多水的容器(2种方法)

文章目录

  • [11. 盛最多水的容器](https://leetcode.cn/problems/container-with-most-water/description/)
  • 双指针算法。
    • 所以大体的思路是
    • ACCode
    • 结果分析
  • 优化的双重for循环。
    • 结果分析

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

你可能感兴趣的:(力扣Hot100,算法,数据结构,java,leetcode)