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)。用于存储链表节点和堆。

相关新闻

最新新闻

Altium Designer六层RK3288平板电脑PCB设计实战教程(含原理图+源文件+高清视频)

Altium Designer六层RK3288平板电脑PCB设计实战教程(含原理图+源文件+高清视频)

温馨提示:文末有联系方式 课程概览 本套RK3288平板电脑PCB设计实战教程,基于Altium Designer平台,完整覆盖六层高密度PCB开发全周期,涵盖芯片级原理图构建、模块化PCB布局策略、关键高速差分走线(如DDR3/LVDS&#xff…

2026/8/26 14:46:23
SPVNAS 点-体素双向转换全解:point_to_voxel 与 GPU 哈希表加速的底层机制

SPVNAS 点-体素双向转换全解:point_to_voxel 与 GPU 哈希表加速的底层机制

SPVNAS 点-体素双向转换全解:point_to_voxel 与 GPU 哈希表加速的底层机制 【免费下载链接】spvnas [ECCV 2020] Searching Efficient 3D Architectures with Sparse Point-Voxel Convolution 项目地址: https://gitcode.com/gh_mirrors/sp/spvnas SPVNAS 是…

2026/8/26 14:46:23
C++起步知识

C++起步知识

目录1 域2 namespace 关键字2.1 命名空间的定义2.2 命名空间的使用2.3 命名空间的作用3 缺省参数4 函数重载5 引用5.1 引用的概念5.2 const 引用5.3 引用的使用场景5.4 引用和指针的区别6 inline 关键字7 nullptr1 域 在 C 中,域包括了函数局部域,全局域…

2026/8/26 14:46:23
【Kingbase人大金仓】账号密码重置忘记密码重置

【Kingbase人大金仓】账号密码重置忘记密码重置

目录 1、停止数据库服务: 2、修改配置文件(修改后可无需密码登录数据库): 3、启动数据库服务: 4、登录数据库: 5、登录数据库之后,执行修改设置账号密码命令: 6、修改配置文件…

2026/8/26 14:46:23
DxWrapper 老游戏兼容修复:3 步让 Windows 10/11 重新跑得动老游戏

DxWrapper 老游戏兼容修复:3 步让 Windows 10/11 重新跑得动老游戏

DxWrapper 老游戏兼容修复:3 步让 Windows 10/11 重新跑得动老游戏 【免费下载链接】dxwrapper Fixes compatibility issues with older games running on Windows 10/11 by wrapping DirectX dlls. Also allows loading custom libraries with the file extension .asi into g…

2026/8/26 14:46:23
天猫店群自动化管理系统:React Event层注入,表单填充速度碾压人工200倍

天猫店群自动化管理系统:React Event层注入,表单填充速度碾压人工200倍

天猫店群自动化管理系统:React Event层注入,表单填充速度碾压人工200倍 搞店群运营这行,天猫的自动化上架,是店群运营中最耗人力也最容易出错的环节。 手动上架一个商品从填写标题、上传主图、设置SKU、填写详情到发布&#xff…

2026/8/26 14:41:23