LeetCode算法题:11. 盛最多水的容器(Java)(双指针问题总结)

news2024/9/22 3:52:47

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0)(i, height[i])

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

在这里插入图片描述

提示:

  • n == height.length
  • 2 <= n <= 10^5
  • 0 <= height[i] <= 10^4

解题思路:

定义两个指针啊a,b分别指向height数组的第一个元素和第二个元素,表示容器的左边和容器右边,定义一个maxVolume表示记录的最大容量,初始定义为0。定义两层循环,外层循环a指针,内层循环b指针,如果当a,b指针所形成容器的容量大于maxVolume时更新maxVolume。遍历完之后找到最大值。

class Solution {
    public int maxArea(int[] height) {
        int maxVolume = 0;
        for(int a=0;a<height.length;a++){
            for(int b=a+1;b<height.length;b++){
                if(((b-a)*Math.min(height[a],height[b]))>maxVolume)maxVolume = (b-a)*Math.min(height[a],height[b]);
            }
        }
        return maxVolume;
    }
}

时间复杂度为O(n^2),空间复杂度为O(1)。提交报错:
在这里插入图片描述
时间复杂度过高,得想办法降低时间复杂度。

修改思路:

初始化定义两个指针a,b分别指向height数组第一个元素和最后一个元素。初始化maxVolume等于height[a]*height[b]表示当前最大容量,分析一下可以知道,当前状态的容量底宽是最宽的情况了,那么容量的大小,取决于左边和后边较矮的边。例如如果当前是a,b所指高度是a所指高度较矮,那么要做到下一次找到的容器比原来的大,只能是找到一个更高的左边才有可能。同理,如果是右边更矮,则要找到一个更高的右边才行。因此每次移动较矮的那一边,如果是左边更矮,则向右移,找到一个比原来左边高的边,重新计算容量;如果是右边更矮,则向左移,找到一个比原来右边高的边。重新计算容量,如果比之前容量大,则更新maxVolume。直到左边指针越过右边指针,则停下。当前maxVolume是最大的容量。

代码:

class Solution {
    public int maxArea(int[] height) {
        int a=0,b=height.length-1;
        int maxVolume=(b-a)*(Math.min(height[a],height[b]));
        int maxLeftEdge = height[a],maxRightEdge = height[b];
        while(a<b){
           if(height[a]<height[b]){
                a = a+1;
                while(height[a]<=maxLeftEdge&&a<b)a=a+1;
           }else{
                b = b-1;
                while(height[b]<=maxRightEdge&&a<b)b=b-1;
           }
           if((b-a)*(Math.min(height[a],height[b]))>maxVolume){
                maxVolume = (b-a)*(Math.min(height[a],height[b]));
                maxLeftEdge = height[a];
                maxRightEdge = height[b];
           }
        }
        return maxVolume;
    }
}

结果:

在这里插入图片描述

上述算法时间复杂度为O(n),空间复杂度为O(1)。
但是看到时间复杂度依然有改进空间。查看1ms时间复杂度的代码:

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

观察发现,总体代码逻辑与我自己的一样,不同点在于每次的maxVolume计算使用了Math.max(max,(r-l)*height[l]),同时是放在if语句中计算。同时只是使用一个临时变量存储之前左右边高度。避免了重复的矮边判断。

总结

双指针问题,较低时间复杂度解题的关键在于如何初始化指针位置以及找到如何移动指针的策略。例如这一题在于初始化指针为第一个元素和最后一个元素,同时分别找到最矮边移动以计算最大值。我文章中的前一题,移动零问题,在于初始化指针都为数组开头,然后移动一个指针寻找非零0,另一个指针定位下一个非零值存放的位置。

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

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

相关文章

寻求发展+兼顾陪读|企业高管赴美国乔治梅森大学做访问学者

E经理拟去美国访学&#xff0c;想达到3个目的&#xff1a;结合本专业方向&#xff0c;扩展至跨学科研究领域&#xff1b;考察市场&#xff0c;寻求新的发展契机&#xff1b;携孩子出国读书&#xff0c;兼顾陪读&#xff0c;并希望尽早出国。最终我们为其落实的乔治梅森大学访问…

AI预测体彩排3采取878定位大底=23策略+杀断组+杀组选+杀和尾+杀和值012缩水测试5月15日预测第1弹

昨天与一位玩排3的彩友通过视频直播的形式聊了下&#xff0c;受益匪浅&#xff0c;给我提供了一些比较有价值的建议&#xff0c;比如&#xff0c;对于878的定位策略&#xff0c;方向是没问题的&#xff0c;但是8783的话&#xff0c;还是缺乏一定的命中率&#xff0c;如果87823&…

做私域,该如何从公域向私域引流?

说到私域运营&#xff0c;很多人首先就会想到&#xff1a;私域流量。企业做私域&#xff0c;流量从哪来&#xff1f;该怎样去引流&#xff1f;又该如何保障私域流量的质量等一系列问题&#xff0c;都需要企业一一解决。所以&#xff0c;今天&#xff0c;我们就来探讨一下&#…

transformer通俗理解

transformer中最麻烦的encoder模块其实张量和矩阵的变化维度比较复杂。我感觉这篇文章讲的特别详细Q、K、V 与 Multi-Head Attention 多头注意力机制 - 知乎 我总结一下文章几个很重要的点吧&#xff01;算是我学的一点收获 1.什么是QKV&#xff1f; 2.怎么理解多头&#xff…

端口号查询进程PID

情况1&#xff1a;由于 idea 突然闪退&#xff0c;导致正在 debug 的 Java 进程没结束掉&#xff0c;端口还在占用&#xff0c;重新 debug 不了&#xff0c;所以需要到任务管理器把进程结束掉 但问题是如果当任务管理器进程同时有多个 Java 进程在运行&#xff08;而且名字一样…

万物皆可监控(shell脚本监控TIDB-DM和DSG同步状态)

监控的方式有很多&#xff0c;常用的有zabbix和prometheus平台&#xff0c;理论上都可以做到对有状态服务的监控&#xff0c;因为我个人对这两个监控平台不是很熟悉&#xff0c;所以一般喜欢使用shell脚本来做监控&#xff1b; 纯oracle 数据库的监控推荐使用EMCC&#xff0c;…

基于火山引擎云搜索的混合搜索实战

在搜索应用中&#xff0c;传统的 Keyword Search 一直是主要的搜索方法&#xff0c;它适合精确匹配查询的场景&#xff0c;能够提供低延迟和良好的结果可解释性&#xff0c;但是 Keyword Search 并没有考虑上下文信息&#xff0c;可能产生不相关的结果。最近几年&#xff0c;基…

淘系淘宝订单详情api接口(订单详情,订单列表,出售中,库存等属性)

淘系淘宝订单详情api接口&#xff08;订单详情&#xff0c;订单列表&#xff0c;出售中&#xff0c;库存等属性&#xff09;

免费泛域名证书申请

通配符证书是一种 SSL/TLS 证书&#xff0c;可用于保护多个域&#xff08;主机&#xff09;&#xff0c;由域名字段中的通配符 (*) 指示。 如果您有很多需要保护的域或子域&#xff0c;这会很有帮助&#xff0c;因为它可以节省您的时间和金钱。 本文将讨论通配符证书、它们的工…

【Win】如何在Windows隐藏安装的程序

由于维护人员或用户可能无意中通过“程序和功能”选项删除对业务至关重要的软件&#xff0c;这导致服务中断或安全风险。为了防止此类情况发生&#xff0c;确保只有授权的用户才能访问和管理系统中的程序。为了实现这一目标&#xff0c;我们将探讨如何在Windows操作系统中隐藏特…

使用高防IP是应对网络安全的重要措施

使用高防IP&#xff08;High Defense IP&#xff09;在现代网络环境中显得尤为重要&#xff0c;这主要源于以下几个方面的原因&#xff1a; 一、网络安全形势严峻 随着互联网的快速发展&#xff0c;网络安全问题日益突出。各种网络攻击手段层出不穷&#xff0c;如分布式拒绝服…

R语言基础--文件读写

From生物技能树&#xff08;R第五节&#xff09; 文章目录 一、文件读写1.注意用project管理工作目录2、文件读取1、读取.txt文件2、读取.csv文件注意&#xff1a;数据框不允许重复的行名 3.数据框的导出4.读取文件的其他方式(用于读取/导出文件的R包)--经验1.base2.readr3.dat…

【会议征稿】2024年机器人前沿技术与创新国际会议(FTIR 2024, 7/19-21)

2024年机器人前沿技术与创新国际会议&#xff08;FTIR 2024&#xff09;将于2024年7月19-21日在中国杭州举行。FTIR 2024聚焦前沿技术与创新&#xff0c;将把机器人领域的创新学者和专家聚集到一个共同的论坛。会议的主要目标是促进机器人的研究和开发活动&#xff0c;另一个目…

使用单目相机前后帧特征点匹配进行3D深度估计的方法

在计算机视觉和机器人领域&#xff0c;三维空间感知是实现环境理解和交互的核心技术之一。特别是在资源受限的场合&#xff0c;使用针孔模型的单目相机进行深度估计成为了一种既经济又实用的解决方案。单目深度估计技术依赖于从连续视频帧中提取和匹配特征点&#xff0c;以估计…

企业大模型如何成为自己数据的“百科全书”?

作者 | 郭炜 编辑 | Debra Chen 在当今的商业环境中&#xff0c;大数据的管理和应用已经成为企业决策和运营的核心组成部分。然而&#xff0c;随着数据量的爆炸性增长&#xff0c;如何有效利用这些数据成为了一个普遍的挑战。 本文将探讨大数据架构、大模型的集成&#xff0…

线上网页点击菜单没有反应 报错ChunkLoadError:Loading chunk chunk-***** failed

现象 点击菜单无反应并且控制台报错Loading chunk chunk-***** failed 具体错误现象截图如下 分析 在线上页面已经打开的情况下&#xff0c;重新打包部署了前端项目。每次打包&#xff0c;js文件的hash值都会发生改变&#xff0c;因为我们的路由采用了懒加载&#xff0c;未…

吴恩达深度学习笔记:优化算法 (Optimization algorithms)2.7

目录 第二门课: 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第二周&#xff1a;优化算法 (Optimization algorithms)2.7 RMSprop 第二门课: 改善深层神经网络&am…

代码复现|Demucs Music Source Separation

一、背景介绍 Demucs是一个开源的音源分离项目。 Demucs在算法层面前后经历了三次大版本的进化&#xff0c;最原始的V1版本是&#xff1a;编解码LSTM。具体算法原理图如下所示。该版本在时域进行音源分离。关于阅读笔记请点击这篇文章。 V1版本原理图 V2版本是同时使用时域和频…

小白必看:新手学编程必会的100个代码

前言 我记得刚开始接触编程的时候&#xff0c;觉得太难了。 也很好奇&#xff0c;写代码的那些人也太厉害了吧&#xff1f;全是英文的&#xff0c;他们的英文水平一定很好吧&#xff1f; 他们是怎么记住这么多代码格式的&#xff1f;而且错了一个标点符号&#xff0c;整个程…

Flash attention入门

一、目录 flash attentionGPU运算流程flash attention 原理flash attention 与 standard attention 时间/内存 对比。flash attention 算法实现比较flash attention 计算、memory-efficient attention 等不同内核下用时 二、实现 flash attention 目的&#xff1a; 提高运行速…