Leetcode 3510. Minimum Pair Removal to Sort Array II

  • Leetcode 3510. Minimum Pair Removal to Sort Array II
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3510. Minimum Pair Removal to Sort Array II

1. 解题思路

这一题和题目3507. Minimum Pair Removal to Sort Array I本质上是同一道题目,唯一的区别在于时间复杂度的要求上面。

对于题目3507,我们可以通过一个二重循环进行实现,时间复杂度为 O ( N 2 ) O(N^2) O(N2),但是放到这里就显然不行了,我们最多只能允许一个时间复杂度为 O ( N ⋅ l o g N ) O(N\cdot logN) O(NlogN)的算法实现。

而这里难度会有两个:

  1. 找到当前最小的相邻元素的和,来进行元素的替换;
  2. 如何判断当前序列是否已经变成了一个单调非减的序列。

正常来说,这俩都需要 O ( N ) O(N) O(N)的时间复杂度,但是,这里,我们需要对其进行优化。

首先,对于第一个问题,找到最小的相邻元素的问题,我们可以通过二分搜索的方式实现,找最小的元素,其时间复杂度就是 O ( l o g N ) O(logN) O(logN),但是问题在于我们在合并之后其前后的元素会同时被调整,因此我们需要维护当前的数组,然后对其前后的元素的和进行同步调整。

而对于第二部分的问题,对于单调非减序列的判断,正常确实需要 O ( N ) O(N) O(N)的时间复杂度,但是这里我们可以通过维护当前数组当中相邻元素的逆序元素的个数来进行判断,对于单调非减序列,其逆序元素的总数必然为0。

因此,这就变成了一个数组的维护问题了。

唯一比较坑的是,如果直接使用二分查找的方式,会出现超时的情况,需要使用堆排来对其进行进一步的优化。

2. 代码实现

给出最终的python代码实现如下:

class Solution:def minimumPairRemoval(self, nums: List[int]) -> int:n = len(nums)index = [i for i in range(n)]pairs = [(nums[i] + nums[i+1], i) for i in range(n-1)]heapq.heapify(pairs)remove = set()reverse_cnt = 0for i in range(n-1):if nums[i] > nums[i+1]:reverse_cnt += 1m = nwhile reverse_cnt > 0:s, idx = heapq.heappop(pairs)if (s, idx) in remove:continueremove.add((s, idx))i = bisect.bisect_left(index, idx)# replace elementx, y = nums[i], nums[i+1]xi, yi = index[i], index[i+1]nums.pop(i+1)nums[i] = x+yindex.pop(i+1)m -= 1if x > y:reverse_cnt -= 1# maintain pre elementif i-1 >= 0:t, ti = nums[i-1], index[i-1]remove.add((t+x, ti))heapq.heappush(pairs, (t+x+y, ti))if (t+x+y, ti) in remove:remove.remove((t+x+y, ti))if t > x:reverse_cnt -= 1if t > x+y:reverse_cnt += 1# maintain post elementif i+1 < m:t, ti = nums[i+1], index[i+1]remove.add((t+y, yi))heapq.heappush(pairs, (t+x+y, xi))if (t+x+y, xi) in remove:remove.remove((t+x+y, xi))if y > t:reverse_cnt -= 1if x+y > t:reverse_cnt += 1return n - m

提交代码评测得到:耗时7765ms,占用内存95.4MB。

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

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

相关文章

【数学建模】(时间序列模型)ARIMA时间序列模型

ARIMA时间序列模型详解及常见时间序列模型概览 文章目录 ARIMA时间序列模型详解及常见时间序列模型概览1 引言2 ARIMA模型的基本概念3 ARIMA模型的组成部分详解3.1 AR模型 (自回归模型)3.2 MA模型 (移动平均模型)3 I (差分) 4 ARIMA模型的建模步骤5 Python实现ARIMA模型6 常见时…

嵌入式AI开发者职业成长路线图

嵌入式AI开发者职业成长路线图 一、核心技术能力构建 1. 深度学习框架 TensorFlow/TensorFlow Lite&#xff1a;适合部署到嵌入式设备PyTorch&#xff1a;研究和原型开发ONNX&#xff1a;模型转换与部署 2. 模型理解与应用 卷积神经网络(CNN)&#xff1a;图像识别、目标检…

单元测试之mockito

简介 mockito是一款模拟测试框架&#xff0c;用于Java开发中的单元测试。通过mockito&#xff0c;可以创建和配置一个对象&#xff0c;通过它来替换对象的外部依赖。 作用&#xff1a;模拟一个类的外部依赖&#xff0c;保证单元测试的独立性。例如&#xff0c;在类A中会调用类…

Oracle数据库数据编程SQL<5 正则表达式函数*****>

Oracle 提供了一组强大的正则表达式函数,用于在 SQL 和 PL/SQL 中进行复杂的模式匹配和文本处理。这些函数基于 POSIX 标准正则表达式,功能强大且灵活。 目录 一、Oracle 正则表达式函数概览 二、函数详解及示例 1. REGEXP_LIKE 2. REGEXP_INSTR 3. REGEXP_SUBSTR 4. …

el-tabs添加按钮增加点击禁止样式

前置文章 一、vue使用element-ui自定义样式思路分享【实操】 二、vue3&ts&el-tabs多个tab表单校验 现状确认 点击添加按钮&#xff0c;没有点击样式&#xff0c;用户感知不明显没有限制最大的tab添加数量&#xff0c;可以无限添加 调整目标&代码编写 调整目标…

DB-Mysql中TIMESTAMP与DATETIME的区别

文章目录 ‌存储范围‌‌时区处理‌存储空间‌默认值和自动更新‌‌零值处理‌适用场景‌总结 在MySQL中&#xff0c;TIMESTAMP和DATETIME是两种常用的日期时间数据类型&#xff0c;它们虽然都用于存储日期和时间&#xff0c;但在多个方面存在显著差异。以下是它们的主要区别&a…

Spring 中有哪些设计模式?

&#x1f9e0; 一、Spring 中常见的设计模式 设计模式类型Spring 中的应用场景单例模式创建型默认 Bean 是单例的工厂模式创建型BeanFactory、FactoryBean抽象工厂模式创建型ApplicationContext 提供多个工厂接口代理模式结构型AOP 动态代理&#xff08;JDK/CGLIB&#xff09;…

C# Winform 入门(3)之尺寸同比例缩放

放大前 放大后 1.定义当前窗体的宽度和高度 private float x;//定义当前窗体的宽度private float y;//定义当前窗台的高度 2.接收当前窗体的尺寸大小 x this.Width;//存储原始宽度ythis.Height;//存储原始高度setTag(this);//为控件设置 Tag 属性 3.声明方法&#xff0c;获…

从零开始的编程-java篇1.6.3

前言&#xff1a; 通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往…

【Redis】数据的淘汰策略

目录 淘汰策略方案&#xff08;8种&#xff09; LRU和LFU策略的区别 使用建议 手搓LRU算法 方式一 方式二 大家好&#xff0c;我是jstart千语。今天和大家回来聊一下redis&#xff0c;这次要讲的是它的淘汰策略。为什么需要淘汰策略呢&#xff0c;就是当redis里面的内存占…

【前端】Node.js一本通

近两天更新完毕&#xff0c;建议关注收藏点赞。 目录 复习Node.js概述使用fs文件系统模块path路径模块 http模块 复习 为什么JS可以在浏览器中执行 原理&#xff1a;待执行的JS代码->JS解析引擎 不同的浏览器使用不同的 JavaScript 解析引擎&#xff1a;其中&#xff0c;C…

【AI论文】JavisDiT: 具备层次化时空先验同步机制的联合音视频扩散Transformer

摘要&#xff1a;本文介绍了一种新型的联合音频-视频扩散变换器JavisDiT&#xff0c;该变换器专为同步音频-视频生成&#xff08;JAVG&#xff09;而设计。 基于强大的扩散变换器&#xff08;DiT&#xff09;架构&#xff0c;JavisDiT能够根据开放式用户提示同时生成高质量的音…

Java-实现公有字段自动注入(创建人、创建时间、修改人、修改时间)

文章目录 Mybatis-plus实现自动注入定义 MetaObjectHandler配置 MyBatis-Plus 使用 MetaObjectHandler实体类字段注解使用服务类进行操作测试 Jpa启用审计功能实现自动注入添加依赖启动类启用审计功能实现AuditorAware接口实体类中使用审计注解 总结 自动注入创建人、创建时间、…

金融机构开源软件风险管理体系建设

开源软件为金融行业带来了创新活力的同时&#xff0c;也引入了一系列独特的风险。金融机构需要构建系统化的风险管理体系&#xff0c;以识别和应对开源软件在全生命周期中的各种风险点。下面我们将解析开源软件在金融场景下的主要风险类别&#xff0c;并探讨如何建立健全的风险…

图形渲染中的定点数和浮点数

三种API的NDC区别 NDC全称&#xff0c;Normalized Device Coordinates Metal、Vulkan、OpenGL的区别如下&#xff1a; featureOpenGL NDCMetal NDCVulkan NDC坐标系右手左手右手z值范围[-1,1][0,1][0,1]xy视口范围[-1,1][-1,1][-1,1] GPU渲染的定点数和浮点数 定点数类型&a…

同花顺客户端公司财报抓取分析

目标客户端下载地址:https://ft.51ifind.com/index.php?c=index&a=download PC版本 主要难点在登陆,获取token中的 jgbsessid (每次重新登录这个字段都会立即失效,且有效期应该是15天的) 抓取jgbsessid 主要通过安装mitmproxy 使用 mitmdump + 下边的脚本实现监听接口…

QT工程建立

打开软件新建一个工程 选择chose 工程命名&#xff0c;选择保存路径&#xff0c;可以自己选择&#xff0c;但是不要有中文路径 默认的直接下一步 任意选一个下一步 点击完成 之后是这个界面&#xff0c;点击右下角的绿色三角形编译一下 实验内容 添加类 第一个是建立cpp和.h文件…

【NLP 53、投机采样加速推理】

目录 一、投机采样 二、投机采样改进&#xff1a;美杜莎模型 流程 改进 三、Deepseek的投机采样 流程 Ⅰ、输入文本预处理 Ⅱ、引导模型预测 Ⅲ、候选集筛选&#xff08;可选&#xff09; Ⅳ、主模型验证 Ⅴ、生成输出与循环 骗你的&#xff0c;其实我在意透了 —— 25.4.4 一、…

ffmpeg时间基与时间戳

时间基、时间戳 时间基&#xff1a;表示时间单位的分数&#xff0c;用来定义视频或音频流中时间的精度。其形式是一个分数&#xff0c;分子通常为 1&#xff0c;而分母则表示每秒的单位数。 时间戳&#xff1a;代表在时间轴里占了多少个格子&#xff0c;是特定的时间点。 时间…

激光加工中平面倾斜度的矫正

在激光加工中&#xff0c;加工平面的倾斜度矫正至关重要&#xff0c;直接影响加工精度和材料处理效果。以下是系统的矫正方法和步骤&#xff1a; 5. 验证与迭代 二次测量&#xff1a;加工后重新检测平面度&#xff0c;确认残余误差。 反馈优化&#xff1a;根据误差分布修正补偿…