LeetCode - 11.盛最多水的容器

devtools/2024/9/22 21:24:55/

一. 题目链接 

LeetCode - 11.盛最多水的容器

二. 思路解释

利用双指针的思想,定义一个left和reght,left指向首部,right指向尾部,计算当前两个指针所对应的高度构成容器的体积。根据当前双指针所指的高度的大小,然后让指针向内移动,直到left=right(一开始left指向首部,right指向尾部,此时容器的底是最大的,接下来随着指针向内移动,会造成容器的底变小,在这种情况下想要让容器盛水变多,就只有在容器的高上下功夫。 那我们该如何决策哪个指针移动呢?我们能够发现不管是左指针向右移动一位,还是右指针向左移动一位,容器的底都是一样的,都比原来减少了 1。这种情况下我们想要让指针移动后的容器面积增大,就要使移动后的容器的高尽量大,所以我们选择指针所指的高较小的那个指针进行移动,这样做可以保留较高柱子的边界,同时增加找到更高柱子并提升容器高度的可能性

  1. 初始化指针: 设置两个指针,一个在数组的开始位置(称为left),另一个在数组的结束位置(称为right)。

  2. 计算容积: 容器的容积由两个指针指向的柱子中较短的那一个决定(因为水的高度由较短的柱子决定),以及两个柱子之间的距离。容积的计算公式为:(right - left) * min(height[left], height[right])

  3. 移动指针: 比较两个指针指向的柱子的高度:

    • 如果height[left] < height[right],则移动left指针向右移动(即left++),因为在这种情况下,可能存在一个更高的柱子在左指针的右边,能与右指针形成更大容积的容器。
    • 反之,如果height[right] <= height[left],则移动right指针向左移动(即right--),出于同样的逻辑,可能存在一个更高的柱子在右指针的左边。
  4. 重复计算与移动: 持续进行容积的计算,并根据上述逻辑移动指针,直到leftright相遇。

  5. 输出最大容积: 在整个过程中,保持一个变量来记录遇到的最大容积,最后输出这个最大值。

使用双指针方法的优点是时间复杂度为O(n),比暴力解法的O(n^2)要高效得多。这种方法之所以有效,是因为它利用了柱子之间距离的递减和可能遇到更高柱子的机会来逐步缩小搜索范围,同时保证没有错过可能的最大容积配置。

  • 时间复杂度 O(N)
  • 空间复杂度 O(1)

三. 动画解释

四. 代码解释

class Solution {
public:int maxArea(vector<int>& height) {int left = 0;//初始化左指针int right = height.size() - 1;//初始化右指针int res = 0;  // 初始化结果变量while (left < right) {int currentArea = (right - left) * min(height[left], height[right]);//计算当前的面积res = max(res, currentArea);  // 更新最大面积if (height[left] > height[right]) {right--;  // 移动较短的一边} else {left++;  // 移动较短的一边}}return res;}
};

注意:每次进行完计算res体积之后,要和之前的res进行对比,如果比它大就替换,比它小就不替换 


http://www.ppmy.cn/devtools/22367.html

相关文章

电力电子技术——PI调节器、电压环及电流环控制原理

电力电子技术——PI调节器、电压环及电流环控制原理 PI调节器 PI调节器是一种常见的闭环控制器,用于调节系统的输出以使其接近期望值。PI调节器由两部分组成:比例(Proportional)和积分(Integral)。比例部分与误差成比例地产生控制输出,而积分部分则对误差进行积分,以…

Windos环境下配置免费SSL证书详细步骤

获取免费证书 配置本机模拟域名 打开如下目录&#xff0c;hosts文件 C:\Windows\System32\drivers\etc 添加如下配置并保存 127.0.0.1 im.test.com下载安装 OpenSSL 下载链接 进入bin目录&#xff0c; 打开cmd窗口 执行如下命令&#xff0c;生成RSA私钥 ## 使用des3…

gitee关联picgo设置自己的typora_图床

一&#xff1a;去gitee官网创建仓库&#xff1a;typora_图床 1.百度搜索关键字&#xff1a;gitee&#xff0c;进入官网 2.进入gitee登录或者注册自己的账号 3.进入主页后&#xff0c;点击右上方 4.点击新建仓库 5.设置仓库名&#xff1a;typora_图床 6.点击5的创建&#xff0…

【Linux】信号的保存及处理

目录 一. 信号的保存1. sigset_t 信号集2. 信号集操作函数sigprocmask()sigpending() 二. 信号的处理1. 用户态和内核态2. 信号处理的过程3. 虚拟地址空间的内核空间4. sigaction 可重入函数volatileSIGCHLD 一. 信号的保存 信号概念的补充, 信号的四种状态: 信号产生(Produce…

recat如何循环?

第一点 声明 声明第一个值 当前值 后面的是方法 需要set开头 声明前要导入import React, { useState } from react; 声明格式 &#xff1a; const 【inp&#xff0c;setinpt】 usestate&#xff08;&#xff09; setinp(res.data.data) 使用去赋值 循环代码 这是一个…

数据库基础:理解与应用索引与视图

文章目录 前言 索引视图 前言 数据库管理涉及索引、视图。本基础篇不涵盖索引和视图的高级应用和核心概念。 索引 MySQL索引是提高查询性能的数据结构&#xff0c;类似于书籍目录&#xff0c;帮助数据库快速找到数据行&#xff0c;避免全表扫描。索引可应用于单列或多列&a…

Docker镜像和容器操作

目录 一.Docker镜像创建与操作 1. 搜索镜像 2. 获取镜像 3. 镜像加速下载 4. 查看镜像信息 5. 查看下载的镜像文件信息 ​编辑6. 查看下载到本地的所有镜像 7. 根据镜像的唯一标识ID号&#xff0c;获取镜像详细信息 8. 为本地的镜像添加新的标签 9. 删除镜像 10. 存入…

17.Nacos与Eureka区别

Nacos会将服务的提供者分为临时实例和非临时实例。默认为临时实例。 临时实例跟eureka一样&#xff0c;会向注册中心报告心跳监测自己是否还活着。如果不正常了nacos会剔除临时实例。&#xff08;捡来的孩子&#xff09; 非临时实例&#xff0c;nacos会主动询问服务提供者是否…