算法随笔_29:最大宽度坡_方法3

上一篇:算法随笔_28:最大宽度坡_方法2-CSDN博客

=====

题目描述如下:

给定一个整数数组 nums,是元组 (i, j),其中  i < j 且 nums[i] <= nums[j]。这样的坡的宽度为 j - i

找出 nums 中的坡的最大宽度,如果不存在,返回 0 。

示例 1:

输入:[6,0,8,2,1,5]
输出:4
解释:
最大宽度的坡为 (i, j) = (1, 5): nums[1] = 0 且 nums[5] = 5.

=====

上一篇讲了最大宽度坡的解法2,那个算法的时间复杂度为O(nlogn) 。

这篇文章我们从另一个角度来考虑这个问题,给出解法3。我们利用二分查找法来解决这个问题。

我们从右往左枚举数组,对于访问的每一个元素i我们考虑其为最大宽度坡的左端点,并寻找它的最大宽度坡。枚举完数组所有元素之后,取所有最大宽度坡的最大值即为答案。

由于枚举一遍左端点需要O(n) 的时间复杂度。我们寻找每个元素i的最大的右端点的时间复杂度需要低于O(n) 。否则的话,就变成了双层循环,暴力解法了。下面我们就给出解法3的步骤和思路。

当我们不断从右向左枚举元素i的时候,我们维护一个不断升序的数组sort_nums。这个数组就是最终题解的右端点的候选集。也就是说,最终的题解只能在这个候选集中选出右端点。

我们每访问一个元素i,就和sort_nums中的最大值比较,大于最大值的元素,放入sort_nums末尾,小于等于最大值的元素,不放入sort_nums。因此这个数组的特征就是元素值是升序的,但元素对应的索引值是下降的。

刚才提到,在维护sort_nums数组时,如果元素i小于等于sort_nums最大值,并不放入sort_nums数组,那这会影响最终结果吗?结论是不会影响最终答案。下面给出证明:

假如元素i是最终答案的右端点,我们设它的左端点为left,由于元素i的值小于等于sort_nums最大值,且元素i的索引也小于sort_nums最大值的索引p。索引p也可以成为元素left的右端点,且(left, p) 的距离肯定比(left, i) 的距离更大。此时与假设矛盾。因此以元素i为右端点的最大宽度坡不可能是最终的答案。所以无需放入sort_nums数组。

对于元素i,它最大宽度坡的右端点需要大于等于它,且尽可能的离它远,即,尽可能的索引值要大。因此我们需要从左向右枚举sort_nums数组,找到第一个大于等于元素i的元素j即可停止枚举。元素j就是元素i的最大宽度坡的右端点。因为sort_nums数组中的元素对应的索引值就是从大到小排列的。

此处,我们还可以做进一步的优化。观察到这个数组的元素是从小到大排列的,既然是有序的,我们就可以用二分查找法来找到第一个大于等于元素i的元素j。

下面是代码实现:

class Solution(object):def biSearch(self,num, sort_nums):lf=0rg=len(sort_nums)while lf<rg:mid=lf+(rg-lf)//2if num > sort_nums[mid][0]:lf=mid+1else:rg=midreturn lfdef maxWidthRamp(self, nums):nums_len=len(nums)w_max=0sort_nums=[[nums[-1],nums_len-1]]for i in range(nums_len-2,-1,-1):lf=self.biSearch(nums[i],sort_nums)if lf < len(sort_nums):rg=sort_nums[lf][1]w_max=max(w_max,rg-i)else:sort_nums.append([nums[i], i])return w_max

***********

代码注解:

1. 为了让大家更清楚了解此题的二分查找过程,在代码里没有使用python的bisect模块。而是实现了一个biSearch。

2. 代码里看起来也没有明显的实现这个过程 (我们每访问一个元素i,就和sort_nums中的最大值比较,大于最大值的元素,放入sort_nums末尾) 。其实这个步骤,在二分查找的时候就已经实现了。因为如果查找后的左侧索引lf达到了数组的长度,说明元素i比sort_nums中的任何值都大。它可以放入sort_nums的末尾。

3.  sort_nums数组里的每个元素也是一个数组,它保存了两个值。一个是原数组的元素值,一个是原数组的元素索引。

***********

此算法的时间复杂度为O(nlogn) 。因为左端点的一次遍历为O(n) ,右端点二分查找为O(logn) 。

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

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

相关文章

目标跟踪之sort算法(3)

这里写目录标题 1 流程1 预处理2 跟踪 2 代码 参考&#xff1a;sort代码 https://github.com/abewley/sort 1 流程 1 预处理 1.1 获取离线检测数据。1.2 实例化跟踪器。2 跟踪 2.1 轨迹处理。根据上一帧的轨迹预测当前帧的轨迹&#xff0c;剔除到当前轨迹中为空的轨迹得到当前…

物业巡更系统在现代社区管理中的优势与应用探讨

内容概要 在现代社区管理中&#xff0c;物业巡更系统正逐渐成为一种不可或缺的工具。结合先进的智能技术&#xff0c;这些系统能够有效地提升社区管理的各个方面&#xff0c;尤其是在巡检效率和信息透明度方面。通过实时记录巡检数据&#xff0c;物业管理人员能够确保工作人员…

深入探讨防抖函数中的 this 上下文

深入剖析防抖函数中的 this 上下文 最近我在研究防抖函数实现的时候&#xff0c;发现一个耗费脑子的问题&#xff0c;出现了令我困惑的问题。接下来&#xff0c;我将通过代码示例&#xff0c;深入探究这些现象背后的原理。 示例代码 function debounce(fn, delay) {let time…

进程通讯——类型和发展

进程常用交互方法如上

健康AI应用的逆袭:如何用“死亡时钟”撬动用户增长和媒体关注,实现应用榜快速排名第六

Death Clock&#xff1a;一款AI驱动的长寿应用 过去六个月里&#xff0c;我一直在为一款名为 Death Clock 的AI驱动长寿应用提供建议。健康类应用的增长向来十分困难&#xff0c;因为它们通常是单人使用的工具&#xff0c;且主要吸引年长的用户群体。然而&#xff0c;与创始人…

区块链在能源行业的应用场景

区块链技术在能源行业的应用正在逐步扩展&#xff0c;并且展现出巨大的潜力。它不仅能够促进能源交易的透明度和效率&#xff0c;还能为能源生产、分配、消费等多个环节提供创新解决方案。以下是对区块链在能源行业应用的一些深入探讨&#xff1a; 1. 能源交易 区块链可以实现…

论文阅读(十五):DNA甲基化水平分析的潜变量模型

1.论文链接&#xff1a;Latent Variable Models for Analyzing DNA Methylation 摘要&#xff1a; 脱氧核糖核酸&#xff08;DNA&#xff09;甲基化与细胞分化密切相关。例如&#xff0c;已经观察到肿瘤细胞中的DNA甲基化编码关于肿瘤的表型信息。因此&#xff0c;通过研究DNA…

基于PostgreSQL的自然语义解析电子病历编程实践与探索(上)

一、引言 1.1研究目标与内容 本研究旨在构建一个基于 PostgreSQL 的自然语义解析电子病历编程体系,实现从电子病历文本中提取结构化信息,并将其存储于 PostgreSQL 数据库中,以支持高效的查询和分析。具体研究内容包括: 电子病历的预处理与自然语言处理:对电子病历文本进…

第1章 量子暗网中的血色黎明

月球暗面的危机与阴谋 量子隧穿效应催生的幽蓝电弧&#xff0c;于环形山表面肆意跳跃&#xff0c;仿若无数奋力挣扎的机械蠕虫&#xff0c;将月球暗面的死寂打破&#xff0c;徒增几分诡异。艾丽伫立在被遗弃的“广寒宫”量子基站顶端&#xff0c;机械义眼之中&#xff0c;倒映着…

【落羽的落羽 数据结构篇】顺序表

文章目录 一、线性表二、顺序表1. 概念与分类2. 准备工作3. 静态顺序表4. 动态顺序表4.1 定义顺序表结构4.2 顺序表的初始化4.3 检查空间是否足够4.3 尾部插入数据4.4 头部插入数据4.5 尾部删除数据4.6 头部删除数据4.7 在指定位置插入数据4.8 在指定位置删除数据4.9 顺序表的销…

大模型GUI系列论文阅读 DAY4续:《Large Language Model Agent for Fake News Detection》

摘要 在当前的数字时代&#xff0c;在线平台上虚假信息的迅速传播对社会福祉、公众信任和民主进程构成了重大挑战&#xff0c;并影响着关键决策和公众舆论。为应对这些挑战&#xff0c;自动化假新闻检测机制的需求日益增长。 预训练的大型语言模型&#xff08;LLMs&#xff0…

基于物联网的智能环境监测系统(论文+源码)

1系统的功能及方案设计 本课题为基于物联网的智能环境监测系统的设计与实现&#xff0c;整个系统采用stm32f103单片机作为主控制器&#xff0c;通过DHT11传感器实现智能环境监测系统温度和湿度的检测&#xff0c;通过MQ传感器实现CO2浓度检测&#xff0c;通过光照传感器实现光照…

反向代理模块。。

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

AI工具灵感速递:离线ChatGPT×自然语言全栈开发×智能文件重命名,开发者效率革命!

↓ 关注小前&#xff0c;捕获全球产品灵感 ↓ ⚡️ 1句Slogan榨干产品灵魂 ⚡️ 3秒 get 全球独立开发者的爆款灵感 今日精选速览&#xff1a; ▸ Llamao&#xff1a;离线私密ChatGPT&#xff0c;设备端AI助手 ▸ co.dev&#xff1a;用自然语言打造全栈应用 ▸ Smart Bul…

【MySQL — 数据库增删改查操作】深入解析MySQL的 Update 和 Delete 操作

1. 测试数据 mysql> select* from exam1; ----------------------------------------- | id | name | Chinese | Math | English | ----------------------------------------- | 1 | 唐三藏 | 67.0 | 98.0 | 56.0 | | 2 | 孙悟空 | 87.0 | 78.…

fpga系列 HDL:XILINX Vivado Vitis 高层次综合(HLS) 实现 EBAZ板LED控制(上)

目录 创建工程创建源文件并编写C代码C仿真综合仿真导出RTL CG导出RTL错误处理&#xff1a; 创建工程 创建源文件并编写C代码 创建源文件(Souces下的hlsv.h和hlsv.cpp&#xff0c;Test Bench下的test_hlsv1.cpp)&#xff1a; hlsv1.h #ifndef HLSV1 #define HLSV1 #include &l…

定西市建筑房屋轮廓数据shp格式gis无偏移坐标(字段有高度和楼层)内容测评

定西市建筑房屋轮廓数据是GIS&#xff08;Geographic Information System&#xff0c;地理信息系统&#xff09;领域的重要资源&#xff0c;用于城市规划、土地管理、环境保护等多个方面。这份2022年的数据集采用shp&#xff08;Shapefile&#xff09;格式&#xff0c;这是一种…

学习数据结构(1)时间复杂度

1.数据结构和算法 &#xff08;1&#xff09;数据结构是计算机存储、组织数据的方式&#xff0c;指相互之间存在⼀种或多种特定关系的数据元素的集合 &#xff08;2&#xff09;算法就是定义良好的计算过程&#xff0c;取一个或一组的值为输入&#xff0c;并产生出一个或一组…

有限元分析学习——Anasys Workbanch第一阶段笔记梳理

第一阶段笔记主要源自于哔哩哔哩《ANSYS-workbench 有限元分析应用基础教程》 张晔 主要内容导图&#xff1a; 笔记导航如下&#xff1a; Anasys Workbanch第一阶段笔记(1)基本信息与结果解读_有限元分析变形比例-CSDN博客 Anasys Workbanch第一阶段笔记(2)网格单元与应力奇…

设计模式Python版 原型模式

文章目录 前言一、原型模式二、原型模式示例三、原型管理器 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&#xff1a;关注类和对…