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

目录

  • 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)
    • 只需要额外的常数级别的空间。

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

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

相关文章

【KingbaseES】实现MySql函数Median

本方法只支持在聚合函数窗口中调用 不支持在GROUP BY中使用&#xff0c;使用plsql写的玩意新能都会稍微差一些 建议使用原生方法修改 CREATE OR REPLACE FUNCTION _final_median(numeric[])RETURNS numeric AS $$SELECT AVG(val)FROM (SELECT valFROM unnest($1) valORDER BY …

wy的leetcode刷题记录_Day72

wy的leetcode刷题记录_Day72 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间&#xff1a; 前言 目录 wy的leetcode刷题记录_Day72声明前言2397. 被列覆盖的最多行数题目介绍思路代码收获 1137. 第 N 个泰波那契数题目介绍思路代码收获 2397. 被列覆…

氢燃料电池——产品标准规范汇总和梳理

文章目录 氢燃料电池模块 氢燃料电池发动机 氢燃料电池汽车 加氢系统 总结 氢燃料电池模块 GB/T 33978-2017 道路车辆用质子交换膜燃料电池模块 GB/T 43361-2023 气体分析 道路车辆用质子交换膜燃料电池氢燃料分析方法的确认 GB/T 29729-2022 氢系统安全的基本要求 GB/T 4…

拿到年终奖后马上辞职,厚道吗?

拿到年终奖后马上辞职&#xff0c;厚道吗&#xff1f; 作为一个人&#xff0c;你首先要对自己负责&#xff0c;其次是对自己身边的人&#xff08;妻儿&#xff0c;家人&#xff0c;朋友&#xff09;负责。 你明明可以跳槽到有更好的职业发展你不去&#xff0c;是为不智&#…

分布式基础概念

分布式基础概念 1 微服务 微服务架构风格&#xff0c;就像是把一个单独的应用程序开发为一套小服务&#xff0c;每个小服务运行在自己的进程中&#xff0c;并使用轻量级机制通信&#xff0c;通常是HTTP API。这些服务围绕业务能力来构建&#xff0c;并通过完全自动化部署机制…

52、全连接 - 特征与样本空间的对应关系

上一节说到经过全连接层之后,神经网络学习到的特征,会从隐层特征空间逐步映射到样本空间,这主要是由于全连接层可以融合全局的特征。 在经过全连接层之后,在 ResNet50 这个神经网络中会输出1000个特征的得分值,这1000个特征的得分值,便可以对应到图像的分类。 怎么对应…

Unity坦克大战开发全流程——开始场景——排行榜数据逻辑

开始场景——排行榜数据逻辑 排行榜单条数据 排行榜列表 然后在数据管理类中声明一个对应的字段 初始化数据 然后再在上一节课所编写的UpdatePanelInfo函数中处理数据更新的逻辑 时间换算算法 然后再在数据管理类中编写一个在排行榜中添加数据的方法以提供给外部 直到当前RankI…

day8--java高级编程:数据结构与集合源码

数据结构与集合源码 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 本章专题与脉络 1. 数据结构剖析 我们举一个形象的例子来理解数据结构的作用&#xff1a; 战场&#xff1a;程序运行所需的软…

CTF-PWN-栈溢出-高级ROP-【SROP】

文章目录 linux信息处理2017 360春秋杯 smallest检查源码思路第一次要执行ret时的栈执行write函数时修改rsp到泄露的栈地址上去 输入/bin/sh并sigreturn调用系统调用回忆exp注意一个离离原上谱的地方 参考链接 SROP(Sigreturn Oriented Programming) 于 2014 年被 Vrije Univer…

stable diffusion 人物高级提示词(一)头部篇

一、女生发型 prompt描述推荐用法Long hair长发一定不要和 high ponytail 一同使用Short hair短发-Curly hair卷发-Straight hair直发-Ponytail马尾high ponytail 高马尾&#xff0c;一定不要和 long hair一起使用&#xff0c;会冲突Pigtails2条辫子-Braid辫子只写braid也会生…

【算法挨揍日记】day46——377. 组合总和 Ⅳ\、96. 不同的二叉搜索树

377. 组合总和 Ⅳ 377. 组合总和 Ⅳ 题目描述&#xff1a; 给你一个由 不同 整数组成的数组 nums &#xff0c;和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 解题思路&#xff1a; 算法思路&a…

尚硅谷大数据技术-数据湖Hudi视频教程-笔记01【概述、编译安装】

大数据新风口&#xff1a;Hudi数据湖&#xff08;尚硅谷&Apache Hudi联合出品&#xff09; B站直达&#xff1a;https://www.bilibili.com/video/BV1ue4y1i7na 尚硅谷数据湖Hudi视频教程百度网盘&#xff1a;https://pan.baidu.com/s/1NkPku5Pp-l0gfgoo63hR-Q?pwdyyds阿里…

Java并发 - Java中所有的锁

Java 中提供了多种锁机制&#xff0c;用于实现多线程之间的同步和互斥。 1. 乐观锁&悲观锁 1.1 特点 乐观锁&#xff1a;假定多个事务之间很少发生冲突&#xff0c;操作不加锁。发生错误的时候进行回滚或重试。 悲观锁&#xff1a;假定冲突可能频繁发生&#xff0c;先…

Linux ---- 进程和计划任务

内核功用&#xff1a;进程管理、内存管理、文件系统、网络功能、驱动程序、安全功能等 一、程序和进程的关系 1、程序 保存在硬盘、光盘等介质中的可执行代码和数据静态保存的代码 2、进程 在CPU及内存中运行的程序代码动态执行的代码父、子进程 每个程序可以创建一个或多个…

[Redis实战]分布式锁-redission

五、分布式锁-redission 5.1 分布式锁-redission功能介绍 基于setnx实现的分布式锁存在下面的问题&#xff1a; 重入问题&#xff1a;重入问题就是指获得锁的线程可以再次进入到相同的锁的代码中&#xff0c;可重入锁的意义在于防止死锁。比如HashTable这样的代码中&#xf…

web自动化测试详细流程和步骤

一、什么是web自动化测试 自动化&#xff08;Automation&#xff09;是指机器设备、系统或过程&#xff08;生产、管理过程&#xff09;在没有人或较少人的直接参与下&#xff0c;按照人的要求&#xff0c;经过自动检测、信息处理、分析判断、操纵控制&#xff0c;实现预期的目…

Linux_apachectl 网页优化

1.1 网页压缩与缓存 在使用 Apache 作为 Web 服务器的过程中&#xff0c;只有对 Apache 服务器进行适当的优化配 置&#xff0c;才能让 Apache 发挥出更好的性能。反过来说&#xff0c;如果 Apache 的配置非常糟糕&#xff0c; Apache 可能无法正常为我们服务。因此&#xff0c…

手把手教你在Ubuntu22上安装VideoRetalking

VideoReTalking是一种新系统&#xff0c;可以根据输入音频编辑真实世界的谈话头部视频的面孔&#xff0c;即使具有不同的情感&#xff0c;也能生成高质量和口型同步的输出视频。我们的系统将这个目标分解为三个连续的任务&#xff1a; &#xff08;1&#xff09;具有规范表情的…

【UEFI基础】EDK网络框架(UNDI)

UNDI UNDI代码综述 UNDI全称Universal Network Driver Interface&#xff0c;它虽然属于UEFI网络框架的一部分&#xff0c;但是并没有在EDK开源代码中实现。不过目前主流网卡厂商都会提供UEFI下的网络驱动&#xff0c;并且大部分都实现了UNDI&#xff0c;这样BIOS下就可以通过…