news 2026/5/1 8:22:17

算法日记分治:用归并排序解决逆序对问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法日记分治:用归并排序解决逆序对问题

🎬 胖咕噜的稞达鸭:个人主页

🔥 个人专栏: 《数据结构》《C++初阶高阶》
《Linux系统学习》
《算法日记》
⛺️技术的杠杆,撬动整个世界!

剑指Offer.数组中逆序对

https://leetcode.cn/problems/shu-zu-zhong-de-ni-xu-dui-lcof/description/

--------------------------------- left mid mid+1 right

利用归并排序解决该问题。
策略一:找出该数之前,有多少个数比我大,

1.nums[cur1] <= nums[cur2] cur1++ 2.nums[cur1] > nums[cur2] ret+=mid - cur1 + 1;cur2++

刚才算法中,数组是升序的,
如果数组是降序的,该怎么做?不能用策略一。
策略二:
可以用降序做,找出该数之后,有多少个数比我小

nums[cur1] > nums[cur2] ret += right - cur2 + 1 nums[cur1] <= nums[cur2] cur2++

方法一:用升序数组来解决这道题

classSolution{inttmp[50001];public:intreversePairs(vector<int>&nums){returnmergeSort(nums,0,nums.size()-1);}intmergeSort(vector<int>&nums,intleft,intright){if(left>=right)return0;//1.找中间点intmid=(left+right)>>1;intret=0;//2.左边的个数(paixu)加上右边的个数 + 排序ret+=mergeSort(nums,left,mid);ret+=mergeSort(nums,mid+1,right);//3.一左一右的个数intcur1=left,cur2=mid+1,i=0;while(cur1<=mid&&cur2<=right){if(nums[cur1]<=nums[cur2]){tmp[i++]=nums[cur1++];}else{ret+=mid-cur1+1;tmp[i++]=nums[cur2++];}}//4.处理排序的while(cur1<=mid)tmp[i++]=nums[cur1++];while(cur2<=right)tmp[i++]=nums[cur2++];for(intj=left;j<=right;j++)nums[j]=tmp[j-left];returnret;}};

方法二:用降序数组来解决这道题

classSolution{inttmp[50001];public:intreversePairs(vector<int>&nums){returnmergeSort(nums,0,nums.size()-1);}intmergeSort(vector<int>&nums,intleft,intright){if(left>=right)return0;//1.找中间点intmid=(left+right)>>1;intret=0;//2.左边的个数(paixu)加上右边的个数 + 排序ret+=mergeSort(nums,left,mid);ret+=mergeSort(nums,mid+1,right);//3.一左一右的个数intcur1=left,cur2=mid+1,i=0;while(cur1<=mid&&cur2<=right){if(nums[cur1]<=nums[cur2]){tmp[i++]=nums[cur2++];}else{ret+=right-cur2+1;tmp[i++]=nums[cur1++];}}//4.处理排序的while(cur1<=mid)tmp[i++]=nums[cur1++];while(cur2<=right)tmp[i++]=nums[cur2++];for(intj=left;j<=right;j++)nums[j]=tmp[j-left];returnret;}};
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 5:47:26

VideoSubtitleGenerator:一键实现多语言字幕生成的智能工具

VideoSubtitleGenerator&#xff1a;一键实现多语言字幕生成的智能工具 【免费下载链接】VideoSubtitleGenerator 批量为本地视频生成字幕文件&#xff0c;并可将字幕文件翻译成其它语言&#xff0c; 跨平台支持 window, mac 系统 项目地址: https://gitcode.com/gh_mirrors/…

作者头像 李华
网站建设 2026/5/1 5:47:33

Mininet终极部署手册:3种高效安装方案全解析

Mininet终极部署手册&#xff1a;3种高效安装方案全解析 【免费下载链接】mininet Emulator for rapid prototyping of Software Defined Networks 项目地址: https://gitcode.com/gh_mirrors/mi/mininet Mininet安装是每个SDN学习者和开发者必须掌握的基础技能&#xf…

作者头像 李华
网站建设 2026/5/1 6:52:36

ms-swift框架下用户体验优化建议生成

ms-swift框架下用户体验优化建议生成 在大模型技术迅猛发展的今天&#xff0c;企业面临的不再是“有没有模型可用”&#xff0c;而是“如何让这些庞然大物真正跑得动、训得快、用得好”。从Llama到Qwen&#xff0c;从纯文本对话到图文音视频融合理解&#xff0c;模型种类日益繁…

作者头像 李华
网站建设 2026/5/1 6:55:02

超详细版JLink接线入门教学

手把手教你搞定 JLink 接线&#xff1a;从零开始的嵌入式调试实战指南 在嵌入式开发的世界里&#xff0c;烧录不成功、下载失败、目标芯片“失联”……这些令人抓狂的问题&#xff0c;十有八九出在最基础的一环—— JLink 接线 。别小看这根短短的排线&#xff0c;它一头连着…

作者头像 李华
网站建设 2026/5/1 5:51:15

mpMath:微信公众号公式编辑终极指南

mpMath&#xff1a;微信公众号公式编辑终极指南 【免费下载链接】mpMath 项目地址: https://gitcode.com/gh_mirrors/mpma/mpMath 还在为微信公众号无法输入数学公式而烦恼吗&#xff1f;mpMath 插件帮你轻松搞定&#xff01; 什么是 mpMath&#xff1f; mpMath 是一款…

作者头像 李华