Kimi    LeetCode 3510. 移除最小数对使数组有序 II Python3实现 以下是 LeetCode 3510. Minimum Pair Removal to Sort Array II 的 Python3 实现。解题思路这道题要求将时间复杂度从 O(n²) 优化到 O(n log n)核心思路是1. 最小相邻对查找使用 最小堆 (heapq) 维护所有相邻元素对的和支持 O(log n) 的插入和弹出最小值。2. 有序性判断不每次扫描整个数组而是维护一个 num_descending 计数器记录当前有多少对相邻元素是递减的即 nums[i] nums[i1]。当计数器为 0 时数组即为非递减序列。3. 双向链表使用 Node 类模拟双向链表实现 O(1) 的节点删除操作。合并两个节点时只需修改指针无需实际移动数组元素。4. 惰性删除堆中可能包含过期的相邻对信息因为某些节点已被合并弹出时检查 node.value node.next.value value不匹配则跳过。Python3 代码pythonimport heapqfrom typing import Listclass Node:def __init__(self, value: int, i: int):self.value value # 当前节点的值self.i i # 原始下标用于打破平局选最左边的对self.prev None # 前一个节点self.next None # 后一个节点self.descending False # 当前节点值 下一个节点值def remove(self):从双向链表中移除当前节点if self.prev:self.prev.next self.nextif self.next:self.next.prev self.prevself.next self.prev Noneclass Solution:def minimumPairRemoval(self, nums: List[int]) - int:n len(nums)if n 1:return 0# 初始化双向链表从右往左构建tail Node(nums[-1], n - 1)for i in range(n - 2, -1, -1):head Node(nums[i], i)head.next tailtail.prev headtail head# 初始化最小堆存储 (相邻对和, 左端点原始下标, 左端点节点引用)heap []num_descending 0cur tailwhile cur and cur.next:heap.append((cur.value cur.next.value, cur.i, cur))cur.descending cur.value cur.next.valueif cur.descending:num_descending 1cur cur.nextif num_descending 0:return 0heapq.heapify(heap)num_operations 0while num_descending 0:value, _, node heapq.heappop(heap)# 惰性删除检查这对是否仍然有效# 如果 node 已被合并没有 next或者和已改变则跳过if not node.next or node.value node.next.value ! value:continue# 合并 node 和 node.next# 1. 处理 node.next 的 descending 标记if node.next.descending:num_descending - 1# 2. 移除 node.next 节点node.next.remove()# 3. 更新 node 的值为两数之和node.value valuenum_operations 1# 4. 更新与 node 相关的相邻对前一个和当前节点for pair in (node.prev, node):if not pair:continuedescending Falseif pair.next:# 将新的相邻对和推入堆heapq.heappush(heap, (pair.value pair.next.value, pair.i, pair))descending pair.value pair.next.value# 更新 descending 计数num_descending descending - pair.descendingpair.descending descendingreturn num_operations复杂度分析- 时间复杂度O(n log n)。每次堆操作 O(log n)每个节点最多被合并一次每个相邻对最多被推入堆两次。- 空间复杂度O(n)。用于存储链表节点和堆。

相关新闻

最新新闻

2026年实用降AI率平台:亲测AI率从90%降至4%的实用方案

2026年实用降AI率平台:亲测AI率从90%降至4%的实用方案

一、前言:2026年毕业必过AIGC检测门槛 2026年国内高校对学术论文的AIGC疑似度审核全面收紧,绝大多数院校都发布了明确的AIGC检测数值要求:985、211院校规定本科论文AI率需低于20%,硕士论文AI率不得高于15%,普通高校也普…

2026/7/8 1:08:43
C语言中的库函数:像“工具箱”一样帮你高效编程

C语言中的库函数:像“工具箱”一样帮你高效编程

别重复造轮子,学会用现成的“神兵利器”一、什么是库函数?想象一下,你要钉一颗钉子,你是自己用铁块打磨一把锤子,还是直接去工具箱拿一把现成的锤子?显然,你会选后者。C语言的库函数就是这种“现…

2026/7/8 1:08:43
【安全与故障排查】03-【复盘】数据库被入侵:从发现到溯源全过程

【安全与故障排查】03-【复盘】数据库被入侵:从发现到溯源全过程

【复盘】数据库被入侵:从发现到溯源全过程 专栏: 安全 & 故障排查 难度: 进阶 标签: 安全事故 入侵溯源 数据库安全 复盘 应急响应前言 这是一次真实的安全事故复盘(已脱敏)。凌晨2点,监控告…

2026/7/8 1:08:43
OpenAI刚推翻了一个80年的单位距离猜想。数学界,是否被彻底颠覆了?

OpenAI刚推翻了一个80年的单位距离猜想。数学界,是否被彻底颠覆了?

1946年,数学家 Paul Erdős(保罗爱尔特希)在《美国数学月刊》上发了一篇很短的文章。他在里面提了一个问题。问题的内容我后面再细说,你先知道两件事就够了:第一,他随手给了一个最简单的答案——像在方格纸…

2026/7/8 1:08:43
SM2258XT 开卡工具 Q1225A 版实战:3步定位闪存ID与B17A制程匹配

SM2258XT 开卡工具 Q1225A 版实战:3步定位闪存ID与B17A制程匹配

SM2258XT开卡实战:3步精准匹配闪存ID与B17A制程的终极指南当你的SM2258XT主控固态硬盘突然罢工,电脑识别为"未初始化"或频繁掉盘时,多数教程只会告诉你"下载开卡工具"——但真正困扰进阶用户的核心痛点,是如何…

2026/7/8 1:08:43
AMD Ryzen终极硬件调试工具:SMUDebugTool完全指南

AMD Ryzen终极硬件调试工具:SMUDebugTool完全指南

AMD Ryzen终极硬件调试工具:SMUDebugTool完全指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcod…

2026/7/8 1:03:43

月新闻