Leetcode算法系列| 11. 盛最多水的容器

news2024/11/28 16:44:56

目录

  • 1.题目
  • 2.题解
    • C# 解法一:暴力
    • C# 解法二:双指针(左指针大于右指针,left++)
    • C# 解法三:双指针优化(左指针小于等于最小高度,left++)
    • Java 解法一:双指针
    • Python3 解法一:双指针

1.题目

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

  • 示例1:
    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 <= 10^5
    • <= height[i] <= 10^4

2.题解

C# 解法一:暴力

  • 这题让我们求两个柱线间能存放的最大空间是多少,第一种解法当然就是暴力啦!我们遍历这个height数组,对每一个位置对我们计算从当前位置到后面的每个柱子间所能存水的数量,如果找出每个位置的最大值,如果比当前的最大值大,则更新,否则不更新。
public class Solution {
    public int MaxArea(int[] height)
   {
       int res = 0;
       for (int i = 0; i < height.Length; i++)
       {
           for (int j = i + 1; j < height.Length; j++)
           {
               int thisArea = (j - i) * Math.Min(height[i], height[j]);
               res = Math.Max(res, thisArea);
           }
       }
       return res;
   }
}
  • 时间复杂度:O(n^2)
    • 有一个双层循环,外层循环从0到height.Length-1,内层循环从i+1到height.Length-1。对于每一个i,内层循环会执行height.Length - i - 1次。因此,总的时间复杂度是这两层循环的乘积。
  • 空间复杂度:O(1)
    • 只使用了几个整数变量来存储中间结果和最终结果,因此,它的空间复杂度是常数级别的,即:
      (O(1))

C# 解法二:双指针(左指针大于右指针,left++)

  • 本题是一道经典的面试题,最优的做法是使用「双指针」。如果第一次看到这题,不一定能想出双指针的做法。
  • 双指针代表的是 可以作为容器边界的所有位置的范围。在一开始,双指针指向数组的左右边界,表示 数组中所有的位置都可以作为容器的边界,因为我们还没有进行过任何尝试。在这之后,我们每次将 对应的数字较小的那个指针 往 另一个指针 的方向移动一个位置,就表示我们认为 这个指针不可能再作为容器的边界了。
  • 我们每次以双指针为左右边界(也就是「数组」的左右边界)计算出的容量中的最大值。
  • 定义两个指针,一个指向数组的开头,一个指向数组的结尾。然后计算两个指针所指向的元素所构成的容器的面积,并记录下最大的面积。然后根据两个指针所指向的元素的大小,移动指针,直到两个指针相遇。
public class Solution {
     public int MaxArea(int[] height)
   {
       int res = 0;
       int left = 0; int right = height.Length - 1;
       while (left < right)
       {
           int thisArea = (right - left) * Math.Min(height[left], height[right]);
           res = Math.Max(res, thisArea);
           if (height[left] > height[right]) right--;
           else left++;
       }
       return res;
    }
}

1

  • 时间复杂度:O(n)
    • 双指针总计最多遍历整个数组一次。
  • 空间复杂度:O(1)
    • 只需要额外的常数级别的空间。

C# 解法三:双指针优化(左指针小于等于最小高度,left++)

public class Solution {
     public int MaxArea(int[] height)
    {
        int res = 0;
        int left = 0; int right = height.Length - 1;
        while (left < right)
        {
            int minHeight = Math.Min(height[left], height[right]);
            int thisArea = (right - left) * minHeight;
            res = Math.Max(res, thisArea);
            if (left < right && height[left] <= minHeight) left++;
            if (left < right && height[right] <= minHeight) right--;
        }
        return res;
    }
}

2

  • 时间复杂度:O(n)
    • 双指针总计最多遍历整个数组一次。
  • 空间复杂度:O(1)
    • 只需要额外的常数级别的空间。

Java 解法一:双指针

public class Solution {
    public int maxArea(int[] height) {
        int l = 0, r = height.length - 1;
        int ans = 0;
        while (l < r) {
            int area = Math.min(height[l], height[r]) * (r - l);
            ans = Math.max(ans, area);
            if (height[l] <= height[r]) {
                ++l;
            }
            else {
                --r;
            }
        }
        return ans;
    }
}

3

  • 时间复杂度:O(n)
    • 双指针总计最多遍历整个数组一次。
  • 空间复杂度:O(1)
    • 只需要额外的常数级别的空间。

Python3 解法一:双指针

class Solution:
    def maxArea(self, height: List[int]) -> int:
        l, r = 0, len(height) - 1
        ans = 0
        while l < r:
            area = min(height[l], height[r]) * (r - l)
            ans = max(ans, area)
            if height[l] <= height[r]:
                l += 1
            else:
                r -= 1
        return ans

4

  • 时间复杂度:O(n)
    • 双指针总计最多遍历整个数组一次。
  • 空间复杂度:O(1)
    • 只需要额外的常数级别的空间。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

xshell设置终端类型为xterm-256color (解决oh-my-tmux颜色失真问题)

文章目录 问题描述解法效果检验 问题描述 在xshell远程连接服务器时&#xff0c;tmux色彩有问题&#xff08;tmux配置为Oh my tmux&#xff09;&#xff0c;如下&#xff1a; 这色彩明显是8位的色彩。 现在终端的标配就是类型为 xterm-256color&#xff0c;其支持256位的真彩…

Maven简介及环境搭建和基本使用(Java开发中的实用工具)

一、概述 Maven 是 Apache 软件基金会的一个开源项目,是一个优秀的项目构建工具,它 用来帮助开发者管理项目中的 jar,以及 jar 之间的依赖关系、完成项目的编译、 测试、打包和发布等工作。 Maven的相关概念 pom.xml文件&#xff1a;里面可以配置相关信息&#xff0c;指导ma…

第一课:Transformer

第一课&#xff1a;Transformer 文章目录 第一课&#xff1a;Transformer1、学习总结&#xff1a;什么是语言模型&#xff1f;大语言模型&#xff08;LLM&#xff09;技术演变史注意力机制Transformer结构课程ppt及代码地址 2、学习心得&#xff1a;3、经验分享&#xff1a;4、…

内联函数的作用

目的 主要为了提升程序运行速度。 分析 当程序调用一个函数时&#xff0c;程序暂停执行当前指令&#xff0c;跳到函数体处执行&#xff0c;在函数执行完后&#xff0c;返回原来的位置继续执行。如果该函数为内联函数&#xff0c;则不需跳&#xff0c;是因为该内联函数直接插…

Python开发GUI常用库PyQt6和PySide6介绍之四:开发示例

Python开发GUI常用库PyQt6和PySide6介绍之四&#xff1a;开发示例 Python开发GUI常用库PyQt6 和 PySide6 介绍系列&#xff0c;已发表的&#xff1a; 之一&#xff1a;简介与安装https://blog.csdn.net/cnds123/article/details/135069944 之二&#xff1a;设计师&#xff0…

python的初识(print+intput函数和变量的基本运用)

#主页传送&#xff1a;江南的江 #每日鸡汤&#xff1a;你要知是非以不辩为解脱&#xff0c;烦恼以忍辱为智慧&#xff0c;办事以尽力为有功&#xff0c;处人以真诚为品格。做人的方略是&#xff1a;把好自己的口&#xff0c;明了心中的事&#xff0c;干好手里的活&#xff0c;走…

鸿蒙 Ark Ui UIAbility组件生命周期

前言&#xff1a; 各位同学有段时间没有见面 因为一直很忙所以就没有去更新博客。最近有在学习这个鸿蒙的ark ui开发 因为鸿蒙不是发布了一个鸿蒙next的测试版本 明年会启动纯血鸿蒙应用 所以我就想提前给大家写一些博客文章 今天要讲的是生命周期&#xff1a; 效果图 &#…

连续分配管理方式-第四十三天

目录 前言 单一连续分配 固定分区分配 分区大小相等 分区大小不等 分区说明表 动态分区分配 问题 用什么样的数据结构记录内存的使用情况 应该选择哪个分区进行分配 分区的分配与回收操作 分配 回收 结论 本节思维导图 前言 连续分配指为用户进程分配的必须是一…

大数据计算基础真题回忆

转载学长20 21的真题 转载链接 注&#xff1a;每年的课件可能会有更改&#xff0c;内容不一样&#xff0c;所以读者复习的时候以所在年份的课件为准 2020 ​ 2021 笔者2023秋 2023 都是大题&#xff0c;没有选择题。 改进的近似算法中&#xff0c;结合具体的例子说明&am…

《3D数学基础-图形和游戏开发》阅读笔记 | 3D数学基础 (学习中 1.4更新)

文章目录 3D数学基础矢量/向量概述 - 什么是向量单位矢量&#xff1a;只关注方向不关注大小 数学运算矢量的加法与减法减法的几何意义计算一个点到另一个点的位移矢量的点积与叉积 矩阵方阵几何意义 - 表示空间坐标的变换 3D数学基础 矢量/向量 在笔记中 变量使用小写字母表…

Python 标准库中的 csv 包

0. Abstract 官方文档很罗嗦&#xff0c;长篇大论例子少。本文将举例说明 csv 包的用法&#xff0c;然后补充一些必要的说明。 1.0 CSV 文件 CSV(Comma-Separated Values,逗号分隔值)文件是一种常见的以纯文本形式存储数据的文件格式。它使用逗号作为字段之间的分隔符&#…

UG装配-引用集

引用集是控制组件的图素在装配体中显示与隐藏 装配体体环境控制组件显示与隐藏的四种方式 1、图层 2、引用集 3、隐藏命令 Ctrl B 4、抑制&#xff0c;取消此组件装配&#xff0c;但保留操作在导航器方便启用 引用集有两种类型 1、UG自动创建的引用集 2、用户定义的引…

ElasticSearch使用Grafana监控服务状态-Docker版

文章目录 版本信息构建docker-compose.yml参数说明 创建Prometheus配置文件启动验证配置Grafana导入监控模板模板说明 参考资料 版本信息 ElasticSearch&#xff1a;7.14.2 elasticsearch_exporter&#xff1a;1.7.0&#xff08;latest&#xff09; 下载地址&#xff1a;http…

部署清华ChatGLM-6B(Linux版)

引言 前段时间,清华公布了中英双语对话模型 ChatGLM-6B,具有60亿的参数,初具问答和对话功能。最!最!最重要的是它能够支持私有化部署,大部分实验室的服务器基本上都能跑起来。因为条件特殊,实验室网络不通,那么如何进行离线部署呢? 「部署环境」:CUDA Version 11.0,…

中国移动联合玻色量子打造“人人可用的量子计算”——恒山光量子算力平台公测上线

​2023年12月1日&#xff0c;中国移动云能力中心&#xff08;简称“移动云”&#xff09;联合北京玻色量子科技有限公司&#xff08;简称“玻色量子”&#xff09;共同打造的“五岳量子计算云平台——恒山光量子算力平台”在苏州正式发布。这是玻色量子继2023年5月16日成功发布…

医院信息系统集成平台—统一身份认证授权平台

统一的数字身份管理包括统一身份管理与授权管理。身份管理和授权管理是访问控制的前提,身份管理对用户的身份进行标识与鉴别;授权管理对用户访问资源的权限进行标识与管理。统一身份管理与授权管理系统作为安全管理中心的一部分,部署于安全管理区域。 医院集成信息平台在医…

大数据应用安全策略包括什么

大数据应用安全策略是为了保障大数据应用中的数据安全而采取的一系列措施&#xff0c;其重要性不容小觑。以下是大数据应用安全策略所包含的主要内容&#xff1a; 一、数据加密与安全存储 数据加密&#xff1a;对于敏感数据&#xff0c;应采用加密技术进行保护&#xff0c;包括…

关于酒的几点思考

你说什么情况下&#xff0c;会让两个大男人手牵着手走路&#xff1f;甚至十指相扣。 不言而明&#xff0c;那肯定是“喝大了”之后。当酒精麻痹了人的神经之后&#xff0c;会让人忘却一切烦恼&#xff0c;让人回归“本真”。当血液中乙醇浓度在0.05-0.1%时&#xff0c;人开始朦…

Android 文字垂直排列,文字向右旋转90度

public class VerticalTextView extends View {private final int ROTATION_ANGLE 90; // 旋转角度&#xff0c;用于将文本垂直排列private String text; // 要显示的文本private TextPaint textPaint; // 用于绘制文本的画笔private Rect textBounds;// 文本边界float x, y;/…

解析为什么Go语言要使用[]rune而不是string来表示中文字符

众所周知&#xff0c;Go语言中有以下这些数据类型。但rune32这个go语言特有的数据类型&#xff0c;比较有意思却经常遭到忽视。所以今天探索学习一下这个数据类型的功能、用法。 Go基本数据类型 布尔&#xff1a;bool 字符串&#xff1a;string 整数&#xff1a; int int8 …