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

给定一个长度为 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.hqwc.cn/news/703895.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

定时发圈操作介绍

1、登陆已有的账号&#xff0c;点击到"朋友圈"功能 2、选择要发圈的微信号&#xff0c;编辑发圈的文案内容 3、自定义想要的时间点 4、点击"立即发送" 5、可进行跟圈

死锁调试技巧:工作线程和用户界面线程

有人碰到了一个死锁问题&#xff0c;找到我们想请我们看看&#xff0c;这个是关于应用程序用户界面相关的死锁问题。 我也不清楚他为什么会找上我们&#xff0c;可能是因为我们经常会和窗口管理器打交道吧。 下面&#xff0c;我们来看看死锁的两个线程。 >> 请移步至 …

pcdn边缘云常见sla有哪些?如何避免被白嫖

PCDN&#xff08;Point-to-Point Content Delivery Network&#xff09;边缘云常见的SLA&#xff08;Service Level Agreement&#xff09;规则包括高峰期离线、服务时间、重传延时、限速等。这些规则是为了保证服务质量和用户体验。下面将详细解释这些规则&#xff0c;并提供一…

【嵌入式大赛应用赛道】机械手臂

电机 进步电机&#xff1a;它的转动是以确定的步数进行的&#xff0c;只要计算好脉冲数量和频率&#xff0c;就可以准确预测和控制电机的转动角度、速度以及停止的位置 伺服电机&#xff1a;将输入的电信号&#xff08;如电压或电流指令&#xff09;转换成轴上的精确旋转运动…

stack、queue、priority_queue以及仿函数

我们上次对std中的list进行实现&#xff0c;今天我们要实现stack、queue、priority_queue以及仿函数。 目录 stack堆堆的框架构造函数push插入pop删除size()大小empty()判断空top()取栈顶的元素 queue队列队列框架问题&#xff1a; 这里我们为什么用deque? 插入删除取头数据取…

线性模型快速入门

使用matplotlib画一条直线 import numpy as np import matplotlib.pyplot as pltx np.linspace(-5, 5, 100) y 0.5*x 3plt.plot(x, y, c"orange") plt.title("Straight Line") plt.show()线性模型的直线表示 import numpy as np import matplotlib.py…

VUE如何实现批量下载多个文件并导出zip格式

效果图 1、安装jszip和file-saver插件 npm install jszip npm install file-saver2、在所需页面引入 import JSZip from "jszip"; import FileSaver from "file-saver";3、模拟fileList数组 //fileList模拟文件数组export default {name: "notic…

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

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

Kubernetes集群部署

目录 引言 一、常见的K8S按照部署方式 &#xff08;一&#xff09;Minikube &#xff08;二&#xff09;Kubeadmin &#xff08;三&#xff09;二进制安装部署 二、二进制安装 &#xff08;一&#xff09;环境准备 1.部署安装环境 1.1 关闭防火墙与selinux 1.2 关闭s…

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

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

C# WinForm —— 21 RichTextBox 使用

1. 加载文件到控件中 加载文件时&#xff0c;要设置文件的路径和类型RichTextBoxStreamType&#xff0c;文件类型包含&#xff1a; RichText 0&#xff1a;富文本格式&#xff08;RTF&#xff09;流PlainText 1&#xff1a;纯文本流对象链接和嵌入&#xff08;OLE&#xff…

恒创科技:域名CNAME解析和A记录解析有哪些区别?

​  域名是互联网上的一种地址&#xff0c;是用以替代复杂IP地址的字符标识&#xff0c;在进行域名解析时&#xff0c;主要有两种常见的记录类型&#xff1a;CNAME 记录和 A记录解析。今天就给大家讲下CNAME解析和A记录解析有哪些区别、优势。这里&#xff0c;我们先了解下什…