LeetCode 11. 盛最多水的容器(超简单讲解)

11. 盛最多水的容器

  • 题目
  • 示例
    • 示例1
    • 示例2
  • 解题思路
    • 双指针
    • 实现设计
  • 详细代码

题目

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

解题思路

双指针

  • 双指针的思想是:我们可以设置两个指针,变换两个指针指向来得到不同结果。
  • 这里我们使用双指针的一种:对撞指针
  • 对撞指针:设计左右两个指针,初始化指向左右两侧,之后不断向内移动某一侧指针,直到两指针相撞,则停止
  • 在这道题目中,我们可以知道,如果固定左右水槽板高度,那么最大盛水量是由更短的水槽板决定的。最大盛水量=更短水槽板长度*水槽板之间的距离。
    在这里插入图片描述
  • 以上图的情况举例,我们看到,两个水槽板中,右侧的水槽板更短(h[j]=7)。
  • 我们如果固定右侧水槽板(h[j]=7),向右移动左侧水槽板(h[i]=8),那么盛水量一定是小于现在的盛水量的。如果想要更大的盛水量,那么应该移动更短的水槽板,即应该向内移动右侧水槽板。
  • 完备性验证:我们如果想要列举所有情况,最简单的思想就是穷举,双循环。外层循环变量为i,初始化指向最左侧。内层循环变量为j,初始化指向最右侧。我们手动模拟如下:
    • 我们取 i=0,h[i]=1,j=8,h[j]=7。我们可知左侧水板更短,无论怎么向内移动右侧水板,在i=0的情况下,穷举所有情况的当前最大水量都是h[1](8-0)=18=8。其实,j为其他的情况就不用考虑了。如果想要找更大的盛水量,只能向内移动左侧水板
    • 我们取i=1,h[i]=8,j=8,h[j]=7,我们可知右侧水板更短,无论怎么向内移动左侧水板,在j=8的情况下,穷举所有情况的当前最大水量都是h[8](8-1)=77=49。而如果向外移动左侧水板,可知这种情况我们在上一步,已经穷举过了。可知,i为其他的情况就不用考虑了。如果想要找更大的盛水量,只能向内移动右侧水板
    • 同理,我们可以一直列举下去。而且因为要盛水,所以一定要求i<=j,所以,i>j的情况就不用考虑了。我们可知,这种方法会保证,i和j会遍历所有可能符合条件的情况,这种方法是保证了完备性的。

实现设计

- low指针指向最左侧, high指针指向最右侧

  • maxContain为最大盛水量,
  • min low指针指向的水板和 high指针指向的水板中,更短的水板长度。
  • 遍历low<high的所有情况,当前最大盛水量currentContain=min*(high-low)
    • 同时更新maxContain(全局最大盛水量)
    • 如果左侧水板为更短水板,向内(即向右)移动左侧水板,即low++;
    • 如果右侧水板为更短水板,向内(即向左)移动右侧水板,即high–;

详细代码

class Solution {
    public int maxArea(int[] height) {
    	//low指针指向最左侧
        int low =0;
        //high指针指向最右侧
        int high = height.length-1;
        // maxContain为最大盛水量,
        int maxContain=0;
         //min为low指针指向的水板和high指针指向的水板中,更短的水板长度。
        int min;
        while(low<high){
            min = height[low]<height[high]?height[low]:height[high];
            int currentContain = (high-low)*min;
            if(currentContain>maxContain){
            	//如果当前最大值大于全局最大值,更新全局最大值
                maxContain=currentContain;
            }
            // 如果左侧水板为更短水板,向内(即向右)移动左侧水板
            if(min==height[low]){
                low++;
            }else{
                high--;
            }
        }
        return maxContain;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/938445.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 集成 Elasticsearch怎样在不启动es的情况下正常启动服务

解释 在spingboot 集成es客户端后&#xff0c;每当服务启动时&#xff0c;服务默认都会查看es中是否已经创建了对应的索引&#xff0c;如果没有索引则创建。基于上面的规则我们可以通过配置不自动创建索引来达到在没有es服务的情况下正常启动服务。 解决办法 在entity类的Docu…

IOTIQS100芯片, TCP 发送数据+NSOSD,data要是hex16进制转换方法

命令&#xff1a;data以十六进制字符串格式发送的数据。 方法 代码 sprintf(temp, "%02X", data[i]);&#xff1a;将当前字节转换为两位宽的大写十六进制字符&#xff0c;并存储在 temp 中。如果需要小写字母&#xff0c;可以将格式说明符改为 "%02x"。 …

Python的3D可视化库【vedo】2-3 (plotter模块) 增删物体、控制相机

文章目录 4 Plotter类的方法4.3 渲染器内的物体操作4.3.1 添加物体4.3.2 移除物体4.3.3 渲染器的内容列表 4.4 相机控制4.4.1 访问相机对象4.4.2 重置相机状态4.4.3 移动相机位置4.4.4 改变相机焦点4.4.5 改变相机朝向的平面4.4.5 旋转相机4.4.6 对齐相机的上朝向4.4.7 缩放 ve…

Mumu模拟器12开启ADB调试方法

在使用安卓模拟器进行开发或调试时&#xff0c;ADB&#xff08;Android Debug Bridge&#xff09;是一项不可或缺的工具。大多数模拟器默认开启了ADB调试功能&#xff0c;但在安装最新版的 Mumu模拟器12 时&#xff0c;可能会遇到 adb devices 无法识别设备的问题。 问题描述 …

【OpenCV计算机视觉】图像处理——平滑

本篇文章记录我学习【OpenCV】图像处理中关于“平滑”的知识点&#xff0c;希望我的分享对你有所帮助。 目录 一、什么是平滑处理 1、平滑的目的是什么&#xff1f; 2、常见的图像噪声 &#xff08;1&#xff09;椒盐噪声 ​编辑&#xff08;2&#xff09; 高斯噪声 &a…

vue CSS 自定义宽高 翻页 剥离 效果

新增需求&#xff0c;客户需要类似PPT的剥离效果用于WEB页面翻页&#xff0c;查找资料后&#xff0c;参考下方的掘金博主的文章&#xff0c;并将HTML修改成vue的页面进行使用。其中宽度、高度改成了变量&#xff0c;样式style中的属性与宽高的关系整理成了公式进行动态计算。 …

单北斗+鸿蒙系统+国产芯片,遨游防爆手机自主可控“三保险”

在当今全球科技竞争日益激烈的背景下&#xff0c;技术自主可控的重要性愈发凸显。它不仅关乎国家安全&#xff0c;更是推动产业升级和经济发展的关键。特别是在一些特殊领域&#xff0c;如防爆通信&#xff0c;自主可控的技术更是不可或缺。遨游通讯推出了一款融合了单北斗、鸿…

Word2Vec:将词汇转化为向量的技术

文章目录 Word2Vec来龙去脉分层Softmax负采样 Word2Vec 下面的文章纯属笔记&#xff0c;看完后不会有任何收获&#xff0c;如果想理解这两种优化技术&#xff0c;给大家推荐一篇博客&#xff0c;讲的很好&#xff1a; 详解-----分层Softmax与负采样 来龙去脉 word2vec,即将词…

虚幻5描边轮廓材质

很多游戏内都有这种描边效果&#xff0c;挺实用也挺好看的&#xff0c;简单复刻一下 效果演示&#xff1a; Linethickness可以控制轮廓线条的粗细 这样连完&#xff0c;然后放到网格体细节的覆层材质上即可 可以自己更改粗细大小和颜色

websocket_asyncio

WebSocket 和 asyncio 指南 简介 本指南涵盖了使用 Python 中的 websockets 库进行 WebSocket 编程的基础知识&#xff0c;以及 asyncio 在异步非阻塞 I/O 中的作用。它提供了构建高效 WebSocket 服务端和客户端的知识&#xff0c;以及 asyncio 的特性和优势。 1. 什么是 WebS…

序列模型的使用示例

序列模型的使用示例 1 RNN原理1.1 序列模型的输入输出1.2 循环神经网络&#xff08;RNN&#xff09;1.3 RNN的公式表示2 数据的尺寸 3 PyTorch中查看RNN的参数4 PyTorch中实现RNN&#xff08;1&#xff09;RNN实例化&#xff08;2&#xff09;forward函数&#xff08;3&#xf…

Hadoop学习笔记(包括hadoop3.4.0集群安装)(黑马)

Hadoop学习笔记 0-前置章节-环境准备 0.1 环境介绍 配置环境&#xff1a;hadoop-3.4.0&#xff0c;jdk-8u171-linux-x64 0.2 VMware准备Linux虚拟机 0.2.1主机名、IP、SSH免密登录 1.配置固定IP地址&#xff08;root权限&#xff09; 开启master&#xff0c;修改主机名为…

【计算机网络】Layer4-Transport layer

目录 传输层协议How demultiplexing works in transport layer&#xff08;传输层如何进行分用&#xff09;分用&#xff08;Demultiplexing&#xff09;的定义&#xff1a;TCP/UDP段格式&#xff1a; UDPUDP的特点&#xff1a;UDP Format端口号Trivial File Transfer Protocol…

Android Studio创建新项目并引入第三方so外部aar库驱动NFC读写器读写IC卡

本示例使用设备&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bbW3AUC&ftt&id615391857885 一、打开Android Studio,点击 File> New>New project 菜单&#xff0c;选择 要创建的项目模版&#xff0c;点击 Next 二、输入项目名称…

【Linux】—简单实现一个shell(myshell)

大家好呀&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流哦&#xff01; 本文由&#xff1a;残念ing原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&…

【Python爬虫系列】_032.Scrapy_全站爬取

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)教程合集 👈👈

Android通过okhttp下载文件(本文案例 下载mp4到本地,并更新到相册)

使用步骤分为两步 第一步导入 okhttp3 依赖 第二步调用本文提供的 utils 第一步这里不做说明了&#xff0c;直接提供第二步复制即用 DownloadUtil 中 download 为下载文件 参数说明 这里主要看你把 destFileName 下载文件名称定义为什么后缀&#xff0c;比如我定义为 .mp4 下…

win10配置子系统Ubuntu子系统(无需通过Windows应用市场)实际操作记录

win10配置子系统Ubuntu子系统&#xff08;无需通过Windows应用市场&#xff09;实际操作记录 参考教程 : win10配置子系统Ubuntu子系统&#xff08;无需通过Windows应用市场&#xff09; - 一佳一 - 博客园 开启虚拟机服务的 以管理员方式运行PowerShell运行命令。 &#xf…

Showrunner AI技术浅析(四):多智能体模拟

多智能体模拟技术涉及多个智能体&#xff08;Agents&#xff09;在虚拟环境中的行为和互动&#xff0c;每个智能体都有自己的属性、目标和行为规则。 1. 多智能体模拟概述 多智能体模拟技术通过模拟多个智能体在虚拟环境中的互动来生成复杂的剧情和场景。每个智能体都有其独特…

创新性融合丨卡尔曼滤波+目标检测 新突破!

2024深度学习发论文&模型涨点之——卡尔曼滤波目标检测 卡尔曼滤波是一种递归算法&#xff0c;用于估计线性动态系统的状态。它通过预测和更新两个步骤&#xff0c;结合系统模型和观测数据&#xff0c;来估计系统状态&#xff0c;并最小化估计的不确定性。 在目标检测中&am…