当前位置: 首页 > article >正文

LeetCode100之盛最多水的容器(11)--Java

1.问题描述

        给定一个长度为 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

        提示

  • n == height.length
  • 2 <= n <= 105
  • 0 <= height[i] <= 104

        难度等级

              中等

        题目链接

        盛最多水的容器

2.解题思路

        这道题是让我们在其中找出盛水最多的容器,我们先来简单的分析一下。容器能盛多少水,取决于它的宽度和高度,我们可以定义两个指针从数组的左右两边向中间移动,也就是一开始假设宽度是最大的,然后在左右指针不断移动的过程中,寻找容器所能盛的最多的水。

        //竖直方向容纳多少水取决于最短的高度
        //水平方向容纳多少水取决于最大的差值
        int head = 0;
        int tail = height.length-1;
        int result = 0;

        容器的高度取决于左右指针的较小值,容器的宽度为左右指针索引的差值,宽*高之后与目前记录的最大值比较,若比最大值大,则更新最大值。

            //宽度
          int w = tail - head;
          //取短边作为高度
          int h = height[head] < height[tail] ? height[head] : height[tail];
          //更新最大值
          result = h * w > result ? h * w : result;

        接着,移动较小边的指针,因为我们要盛尽可能多的水,就必须让高尽可能的大,接着重复上述操作,知道指针相遇退出循环。

          //移动短边的指针
          if(height[head] < height[tail]){
            head++;
          }else{
            tail--;
          }
             

3.代码展示

class Solution {
    public int maxArea(int[] height) {
        //竖直方向容纳多少水取决于最短的高度
        //水平方向容纳多少水取决于最大的差值
        int head = 0;
        int tail = height.length-1;
        int result = 0;
        while(head < tail){
            //宽度
          int w = tail - head;
          //取短边作为高度
          int h = height[head] < height[tail] ? height[head] : height[tail];
          //更新最大值
          result = h * w > result ? h * w : result;
          //移动短边的指针
          if(height[head] < height[tail]){
            head++;
          }else{
            tail--;
          }
             
        }
        return result;
    }
}

4.总结

        这道题我觉得唯一难的地方就是能不能想到一开始假设两个条件中的宽最大,左右指针从数组左右两边向中间靠拢,其他的地方,我感觉没啥太大的难度。祝大家刷题愉快!


http://www.kler.cn/a/379465.html

相关文章:

  • 【系统架构设计师】2023年真题论文: 论面向对象分析的应用与实现(包括解题思路和素材)
  • 在Mac下安装时间序列软件Hector
  • SpringBoot+VUE2完成WebSocket聊天(数据入库)
  • Webserver(2.6)信号
  • 关于自动驾驶等级相关知识
  • MySQL 数据库备份与恢复
  • 【JAVA】第3关:素数链
  • HJ43 迷宫问题
  • 虚拟机安装
  • 危机来临前---- 力扣: 876
  • 双指针-01-三数之和
  • LeetCode:3259. 超级饮料的最大强化能量(DP Java)
  • 架构师考试系列(8)论文专题:信息系统安全设计
  • 微服务系列三:微服务核心——网关路由
  • 穿越数据迷宫
  • 总结拓展十五:SAP物料分割评估
  • C++ | Leetcode C++题解之第530题二叉搜索树的最小绝对差
  • 解决Corrupt JPEG data: premature end of data segment
  • Oracle视频基础1.3.5练习
  • 操作系统(9) (并发-----原子性/互斥临界区/生产者消费者问题/临界区问题三条件/互斥性/进展性/公平性)
  • Linux(centOS)的安全命令
  • 鸿蒙移动应用开发-------前篇
  • 泛微开发修炼之旅--52关于ecology首页待办修改源码位置记录
  • Windows Qt 6安装Oracle QOCI SQL Driver插件
  • No.24 笔记 | WEB安全 - 任意文件包含漏洞 part 6
  • Flutter使用share_plus是提示发现了重复的类