Leetcode 11. 盛最多水的容器

118 阅读2分钟

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

一、题目描述

  • 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。

二、思路分析

  • 首先我们定义一个变量,用于存储结果,然后可以用双指针进行解题,第一个指针指向首位第二个指针指向末尾
    • 首尾两数比较,取最小的值,和两下标的差值相乘,将结果赋值给我们定义的变量
    • 最小的值的下标,向中心移动一位,再次比较首尾,取最小的值,和两下标的差值相乘
    • 结果变量比较如果新的结果比变量值大,则进行交换,反之继续重复上一步

三、AC 代码:

class Solution {
    public int maxArea(int[] height) {
        //定义三个变量,分别为左右指针和装水容量
      int i = 0,j = height.length -1;
      int maxarea = 0;
      //终止条件,不能有等号,等号是两个指针指向同一个元素,无法装水
      while(i < j){
          //左右指针中最短的那个为高度
          int h = Math.min(height[i],height[j]);
          //计算容器的体积,并进行比较更新
           maxarea = Math.max(maxarea,(j - i)*h);
           //哪端小于或者等于高度移动那端
         if(height[i] <= h)i++;
         if(height[j]<= h) j--;
      }
      return maxarea;
    }
}



四、总结:

  • 好了,代码撸完,我们总结一下
    • 这道题运用了双指针的解法
    • 细节,要注意while退出条件< 时退出
    • 尾指针是数组长度减一
    • 面积是两个下标相减即可,不需要减一
    • 高度相等的情况需要进行移动下标

最后这个算法是Leetcode的第11题,是热题100的第七题,去年我刷了热题100用时一个月左右,接下来我会继续更新,小伙伴可以点一下关注,如果你也在刷热题100的话,希望可以对你有一些启发!