当前位置: 首页 > article >正文

2026-04-19:固定长度子数组中的最小逆序对数目。用go语言,给你一个整数数组 nums(长度为 n)和一个整数 k。所谓“逆序对”,指的是在数组中下标满足 i < j 且 nums[i] >

2026-04-19固定长度子数组中的最小逆序对数目。用go语言给你一个整数数组 nums长度为 n和一个整数 k。所谓“逆序对”指的是在数组中下标满足 i j 且 nums[i] nums[j] 的任意一对位置 (i, j)。对某个连续片段即子数组而言统计它内部所有满足上述条件的逆序对数量这个数量就是该子数组的“逆序对数量”。现在考虑 nums 中所有长度恰好为 k 的连续子数组要求找出其中逆序对数量的最小值并返回。1 n nums.length 100000。1 nums[i] 1000000000。1 k n。输入nums [5,3,2,1], k 4。输出6。解释只有一个长度为 k 4 的子数组[5, 3, 2, 1]。在该子数组中逆序对为(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), 和 (2, 3)。逆序对总数为 6因此最小逆序对数量是 6。题目来自力扣3768。大体步骤如下一、核心前置知识铺垫逆序对子数组内满足ij 且 nums[i]nums[j]的数对我们要统计每个长度为k的连续子数组的逆序对总数找最小值。滑动窗口数组中所有长度为k的连续子数组本质是一个固定大小为k的窗口从左向右滑动每次移动一位。树状数组高效完成单点更新和前缀和查询的数据结构用来快速统计逆序对避免暴力枚举超时。离散化因为数组元素值最大可达1e9无法直接用树状数组存储所以把原数组的值映射为连续的小整数1,2,3…。二、分步骤详细执行过程步骤1离散化处理压缩数值范围原数组[5, 3, 2, 1]克隆原数组并排序、去重得到排序去重数组[1,2,3,5]把原数组的每个值替换为它在排序数组中的位置1树状数组下标从1开始5 → 43 → 32 → 21 → 1离散化后的数组[4, 3, 2, 1]✅ 作用把超大数值变成1~4的连续整数适配树状数组。步骤2初始化核心变量初始化树状数组长度为离散化后最大值1 5初始值全0。逆序对计数器inv 0记录当前窗口的逆序对总数。答案变量ans 最大值存储所有窗口的最小逆序对。固定窗口大小k4。步骤3滑动窗口遍历数组逐个元素处理我们遍历离散化后的数组[4,3,2,1]每一步分为元素入窗口 → 计算逆序对 → 窗口成型则更新答案 → 元素出窗口。第1次遍历处理第一个元素4元素入窗口把数字4加入树状数组树状数组标记4的位置计数1。累加逆序对当前窗口内比4大的数字个数为0逆序对总数inv 0。窗口判断当前窗口长度1 4未形成有效窗口不执行后续操作。第2次遍历处理第二个元素3元素入窗口把数字3加入树状数组树状数组标记3的位置计数1。累加逆序对当前窗口内比3大的数字只有4逆序对总数inv 1。窗口判断当前窗口长度2 4未形成有效窗口不执行后续操作。第3次遍历处理第三个元素2元素入窗口把数字2加入树状数组树状数组标记2的位置计数1。累加逆序对当前窗口内比2大的数字有4、3逆序对总数inv 123。窗口判断当前窗口长度3 4未形成有效窗口不执行后续操作。第4次遍历处理第四个元素1元素入窗口把数字1加入树状数组树状数组标记1的位置计数1。累加逆序对当前窗口内比1大的数字有4、3、2逆序对总数inv 336。窗口判断窗口长度4刚好形成第一个有效窗口。更新最小答案当前逆序对总数6是最小值ans6。元素出窗口窗口左侧第一个元素4移出树状数组树状数组标记4的位置计数-1。修正逆序对减去移出元素4带来的逆序对数量逆序对总数更新。步骤4遍历结束输出结果整个数组遍历完成唯一的有效窗口逆序对总数为6最终返回6。三、关键逻辑补充说明元素入窗口时用树状数组快速查询当前窗口中比新元素大的数字个数直接累加到逆序对总数。窗口成型后用当前逆序对总数更新最小值。元素出窗口时用树状数组快速查询比移出元素小的数字个数从逆序对总数中减去因为这个元素离开了窗口它贡献的逆序对也要删掉。提前终止如果逆序对总数变为0理论最小值直接结束计算优化效率。四、时间复杂度分析离散化排序去重映射时间复杂度为O(n log n)。滑动窗口遍历遍历n个元素每个元素执行2次树状数组操作更新查询树状数组单次操作复杂度为O(log m)m是离散化后的数值范围m≤n。总遍历复杂度O(n log n)。✅总的时间复杂度O(n log n)这是处理n≤1e5数据的最优复杂度能完美通过题目限制五、额外空间复杂度分析额外空间指除输入数组外代码主动开辟的空间离散化用的排序数组O(n)。树状数组O(n)。其他临时变量O(1)。✅总的额外空间复杂度O(n)总结执行流程离散化压缩数值 → 滑动窗口遍历元素 → 树状数组高效统计逆序对 → 维护最小逆序对数量时间复杂度O(n log n)适配1e5规模数据额外空间复杂度O(n)。Go完整代码如下packagemainimport(fmtmathslicessort)typefenwick[]intfunc(t fenwick)update(i,valint){for;ilen(t);ii-i{t[i]val}}func(t fenwick)pre(iint)(resint){for;i0;ii-1{rest[i]}return}funcminInversionCount(nums[]int,kint)int64{// 离散化sorted:slices.Clone(nums)slices.Sort(sorted)sortedslices.Compact(sorted)fori,x:rangenums{nums[i]sort.SearchInts(sorted,x)1// 树状数组下标从 1 开始}t:make(fenwick,len(sorted)1)inv:0ans:math.MaxIntfori,in:rangenums{// 1. 入t.update(in,1)invmin(i1,k)-t.pre(in)// 窗口大小 - (x 的元素个数) (x 的元素个数)left:i1-kifleft0{// 尚未形成第一个窗口continue}// 2. 更新答案ansmin(ans,inv)ifans0{// 已经最小了无需再计算break}// 3. 出out:nums[left]inv-t.pre(out-1)// out 的元素个数t.update(out,-1)}returnint64(ans)}funcmain(){nums:[]int{5,3,2,1}k:4result:minInversionCount(nums,k)fmt.Println(result)}Python完整代码如下# -*-coding:utf-8-*-fromtypingimportListclassFenwick:def__init__(self,n:int):self.nn self.bit[0]*(n1)defupdate(self,i:int,val:int)-None:将位置i增加vali从1开始whileiself.n:self.bit[i]val ii-idefpre(self,i:int)-int:前缀和1到i的和res0whilei0:resself.bit[i]ii-1returnresdefmin_inversion_count(nums:List[int],k:int)-int: 计算所有长度为k的子数组中逆序对的最小值 # 离散化sorted_numssorted(set(nums))# 映射到1,2,3,...树状数组下标从1开始num_to_idx{val:idx1foridx,valinenumerate(sorted_nums)}nums[num_to_idx[x]forxinnums]# 树状数组bitFenwick(len(sorted_nums))inv0# 当前窗口的逆序对数ansfloat(inf)fori,numinenumerate(nums):# 1. 入将当前元素加入窗口bit.update(num,1)# 窗口大小 min(i1, k)window_sizemin(i1,k)# 大于num的元素个数 窗口大小 - 小于等于num的元素个数invwindow_size-bit.pre(num)lefti1-kifleft0:# 尚未形成第一个窗口continue# 2. 更新答案ansmin(ans,inv)ifans0:# 已经是最小值无需继续计算break# 3. 出移除窗口最左边的元素out_numnums[left]# 小于out_num的元素个数这些元素与out_num构成逆序对inv-bit.pre(out_num-1)bit.update(out_num,-1)returnint(ans)defmain():nums[5,3,2,1]k4resultmin_inversion_count(nums,k)print(result)if__name____main__:main()C完整代码如下#includeiostream#includevector#includealgorithm#includeclimitsusingnamespacestd;classFenwick{private:vectorintbit;public:Fenwick(intn):bit(n1,0){}voidupdate(inti,intval){for(;ibit.size();ii-i){bit[i]val;}}intpre(inti){intres0;for(;i0;ii-1){resbit[i];}returnres;}};longlongminInversionCount(vectorintnums,intk){// 离散化vectorintsortednums;sort(sorted.begin(),sorted.end());sorted.erase(unique(sorted.begin(),sorted.end()),sorted.end());for(inti0;inums.size();i){nums[i]lower_bound(sorted.begin(),sorted.end(),nums[i])-sorted.begin()1;// 树状数组下标从1开始}Fenwickbit(sorted.size());intinv0;intansINT_MAX;for(inti0;inums.size();i){intinnums[i];// 1. 入bit.update(in,1);invmin(i1,k)-bit.pre(in);// 窗口大小 - (x的元素个数) (x的元素个数)intlefti1-k;if(left0){// 尚未形成第一个窗口continue;}// 2. 更新答案ansmin(ans,inv);if(ans0){// 已经最小了无需再计算break;}// 3. 出intoutnums[left];inv-bit.pre(out-1);// out的元素个数bit.update(out,-1);}return(longlong)ans;}intmain(){vectorintnums{5,3,2,1};intk4;longlongresultminInversionCount(nums,k);coutresultendl;return0;}

相关文章:

2026-04-19:固定长度子数组中的最小逆序对数目。用go语言,给你一个整数数组 nums(长度为 n)和一个整数 k。所谓“逆序对”,指的是在数组中下标满足 i < j 且 nums[i] >

2026-04-19&#xff1a;固定长度子数组中的最小逆序对数目。用go语言&#xff0c;给你一个整数数组 nums&#xff08;长度为 n&#xff09;和一个整数 k。所谓“逆序对”&#xff0c;指的是在数组中下标满足 i < j 且 nums[i] > nums[j] 的任意一对位置 (i, j)。 对某个连…...

实战秘籍:如何让2007年老Mac流畅运行最新macOS?OCLP深度解析

实战秘籍&#xff1a;如何让2007年老Mac流畅运行最新macOS&#xff1f;OCLP深度解析 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 想让你的老Mac重新焕发青…...

rust 1.95.0 最新版发布:语言特性、编译器、平台支持、标准库、Rustdoc 与兼容性变更全解析

rust 1.95.0 最新版发布&#xff1a;语言特性、编译器、平台支持、标准库、Rustdoc 与兼容性变更全解析 2026年4月16日&#xff0c;Rust 1.95.0 正式发布。作为一次重要版本更新&#xff0c;这一版在语言层、编译器、平台支持、标准库、Rustdoc 以及兼容性方面都带来了相当丰富…...

从Java全栈到前端框架:一位工程师的面试实录

从Java全栈到前端框架&#xff1a;一位工程师的面试实录 今天&#xff0c;我作为一位拥有5年经验的Java全栈开发工程师&#xff0c;迎来了在一家知名互联网大厂的面试。这次面试由一位资深技术面试官主持&#xff0c;他以专业严谨的态度引导我逐步展示自己的技能和项目经验。 …...

终极M3U8视频下载指南:告别命令行,用图形界面轻松下载在线视频

终极M3U8视频下载指南&#xff1a;告别命令行&#xff0c;用图形界面轻松下载在线视频 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG 还在为复杂的命令行操作而烦恼吗&#xff1…...

别再只用findContours了!OpenCV连通域分析connectedComponentsWithStats()保姆级教程

连通域分析进阶&#xff1a;用connectedComponentsWithStats()替代findContours()的五大理由 在图像处理项目中&#xff0c;我们经常需要分析图像中的独立区域。许多开发者第一反应就是使用findContours()函数——这确实是个经典选择&#xff0c;但它真的是最优解吗&#xff1f…...

3步解锁百度网盘SVIP下载加速:Mac用户必看的终极提速指南

3步解锁百度网盘SVIP下载加速&#xff1a;Mac用户必看的终极提速指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘缓慢的下载速度而烦…...

技术空对象的默认行为与空值处理

技术空对象的默认行为与空值处理 在软件开发中&#xff0c;空对象&#xff08;Null Object&#xff09;和空值&#xff08;Null或None&#xff09;的处理是常见但容易被忽视的问题。空对象通常指代一个无实际意义的占位符&#xff0c;而空值则可能引发程序崩溃或逻辑错误。合理…...

手把手教你部署Stable Diffusion 3.5 FP8:小白友好的AI绘画工具

手把手教你部署Stable Diffusion 3.5 FP8&#xff1a;小白友好的AI绘画工具 1. 前言&#xff1a;为什么选择SD 3.5 FP8&#xff1f; 如果你对AI绘画感兴趣&#xff0c;一定听说过Stable Diffusion这个强大的文本生成图像工具。今天我要介绍的是它的最新升级版本——Stable Di…...

解决PyTorch那个恼人的CUDA断言错误:一个真实数据清洗案例复盘

解决PyTorch那个恼人的CUDA断言错误&#xff1a;一个真实数据清洗案例复盘 那是一个周五的深夜&#xff0c;办公室里只剩下我和咖啡机还在运转。我正在为下周要交付的图像分类模型做最后的训练&#xff0c;突然屏幕上跳出了那个让所有PyTorch开发者都心头一紧的错误&#xff1a…...

别再为MAC地址发愁了!三种为W5500/W5100等网络芯片生成合法地址的实战方法

WIZnet网络芯片MAC地址生成实战指南&#xff1a;从合规到高效 在嵌入式网络设备开发中&#xff0c;MAC地址就像设备的身份证号码&#xff0c;不仅需要全球唯一&#xff0c;还要符合行业规范。对于使用W5500、W5100等WIZnet系列网络芯片的开发者来说&#xff0c;如何生成既合法又…...

B站视频下载终极指南:3分钟掌握BilibiliDown高效批量下载技巧

B站视频下载终极指南&#xff1a;3分钟掌握BilibiliDown高效批量下载技巧 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mi…...

别再只盯着数据手册了!手把手教你用MPU6500的DMP实现姿态解算(附STM32代码)

解锁MPU6500的DMP潜能&#xff1a;从寄存器配置到姿态解算实战 在嵌入式运动控制领域&#xff0c;MPU6500凭借其内置的数字运动处理器(DMP)成为许多开发者的首选。但手册中晦涩的寄存器配置和零散的应用笔记常常让人望而却步。本文将带您深入DMP的核心工作机制&#xff0c;通过…...

3分钟搞定Android Studio中文界面:告别英文困扰的终极配置指南

3分钟搞定Android Studio中文界面&#xff1a;告别英文困扰的终极配置指南 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 还在为…...

如何通过图形界面轻松掌控戴尔服务器风扇转速?Dell Fans Controller 实用指南

如何通过图形界面轻松掌控戴尔服务器风扇转速&#xff1f;Dell Fans Controller 实用指南 【免费下载链接】dell_fans_controller A tool for control the Dell server fans speed, it sends the control instruction by ipmitool over LAN for Windows, it is a GUI applicati…...

25+平台直播录制实战:Fideo跨平台架构解析与性能优化指南

25平台直播录制实战&#xff1a;Fideo跨平台架构解析与性能优化指南 【免费下载链接】fideo-live-record A convenient live broadcast recording software! Supports Tiktok, Youtube, Twitch, Bilibili, Bigo!(一款方便的直播录制软件! 支持tiktok, youtube, twitch, 抖音&am…...

Ofd2Pdf:3种方法彻底解决OFD文档兼容性问题

Ofd2Pdf&#xff1a;3种方法彻底解决OFD文档兼容性问题 【免费下载链接】Ofd2Pdf Convert OFD files to PDF files. 项目地址: https://gitcode.com/gh_mirrors/ofd/Ofd2Pdf OFD作为中国自主的电子文档格式标准&#xff0c;在政务、金融、税务等领域广泛应用&#xff0c…...

终极视频下载助手:一键抓取网页视频的完整解决方案

终极视频下载助手&#xff1a;一键抓取网页视频的完整解决方案 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 还在为无法下载网页视频而烦恼…...

终极指南:用Mac Mouse Fix让普通鼠标超越苹果触控板体验

终极指南&#xff1a;用Mac Mouse Fix让普通鼠标超越苹果触控板体验 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 你是否曾经在Mac上使用第三…...

番茄小说下载器完整指南:打造个人离线图书馆的终极解决方案

番茄小说下载器完整指南&#xff1a;打造个人离线图书馆的终极解决方案 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 你是否曾经在地铁里信号断断续续&#xff0c;想看的章节…...

抖音批量下载器终极指南:免费获取高清无水印视频的完整教程

抖音批量下载器终极指南&#xff1a;免费获取高清无水印视频的完整教程 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback …...

Redis桌面管理器终极指南:告别命令行,用Another Redis Desktop Manager轻松管理数据库

Redis桌面管理器终极指南&#xff1a;告别命令行&#xff0c;用Another Redis Desktop Manager轻松管理数据库 【免费下载链接】AnotherRedisDesktopManager &#x1f680;&#x1f680;&#x1f680;A faster, better and more stable Redis desktop manager [GUI client], co…...

Illustrator脚本终极指南:25个免费工具彻底改变你的设计工作流

Illustrator脚本终极指南&#xff1a;25个免费工具彻底改变你的设计工作流 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 如果你正在寻找能够显著提升Adobe Illustrator工作效率的…...

别再死记硬背MAML公式了!用PyTorch手把手带你跑通第一个元学习Demo(附完整代码)

从零实现MAML元学习&#xff1a;PyTorch实战指南与核心代码解析 元学习&#xff08;Meta-Learning&#xff09;作为机器学习领域的前沿方向&#xff0c;正在重新定义我们构建智能系统的方式。与传统的"从零学习"模式不同&#xff0c;元学习让模型掌握了"学习如何…...

ClawdBot进阶配置:Telegram频道对接、代理设置、高级参数调整

ClawdBot进阶配置&#xff1a;Telegram频道对接、代理设置、高级参数调整 1. 环境准备与基础配置 在开始高级配置前&#xff0c;确保已完成ClawdBot的基础部署。以下是快速验证环境状态的命令&#xff1a; # 检查服务状态 clawdbot status# 查看模型列表 clawdbot models li…...

ENVI 5.3 实战:手把手教你用Landsat 7数据反演城市热岛效应(附完整Band Math公式)

ENVI 5.3实战&#xff1a;城市热岛效应分析的完整技术路线与创新应用 城市热岛效应是当代城市规划与环境监测领域的重要课题。当我们在ENVI软件中打开一张Landsat 7影像时&#xff0c;那些看似普通的像素值背后隐藏着城市热环境的秘密。本文将带您走完从原始数据到热岛分析的全…...

校准预测、遗憾匹配与博弈均衡

EC’20&#xff1a;校准预测、遗憾匹配、动态与均衡 耶路撒冷希伯来大学教授Sergiu Hart讨论了两篇获奖论文所分享的研究成果&#xff0c;这两篇论文分别获得了ACM SIGecom时间检验奖和博士论文奖。 2020年7月23日 1分钟阅读 在第21届ACM经济学与计算大会&#xff08;EC’20&am…...

软考架构设计师论文 —— 论系统性能测试技术及其应用(1)

论题 随着互联网应用规模化、业务场景复杂化,系统在高并发、大数据量场景下的性能表现直接影响用户体验与业务连续性 —— 响应延迟、并发处理能力不足、资源耗尽等问题可能导致用户流失或重大业务损失。性能测试作为软件质量保障的核心环节,通过模拟真实业务负载验证系统的…...

从零开始掌握编程:游戏化学习平台的终极指南 [特殊字符]

从零开始掌握编程&#xff1a;游戏化学习平台的终极指南 &#x1f3ae; 【免费下载链接】codecombat Game for learning how to code. 项目地址: https://gitcode.com/gh_mirrors/co/codecombat 还在为枯燥的编程语法而烦恼吗&#xff1f;CodeCombat游戏化编程学习平台彻…...

5个理由告诉你:为什么GalForUnity是Unity文字游戏开发的终极解决方案

5个理由告诉你&#xff1a;为什么GalForUnity是Unity文字游戏开发的终极解决方案 【免费下载链接】GalForUnity 一个为Unity开发的文字游戏开发插件&#xff0c;采用可视化的工作流&#xff0c;同样也可以高度自定义&#xff0c;他同时支持Live2D 项目地址: https://gitcode.…...