news 2026/5/15 17:47:33

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

作者头像

张小明

前端开发工程师

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/15 17:47:03

DepthCrafter深度解析:重构视频三维感知的技术路径

DepthCrafter深度解析&#xff1a;重构视频三维感知的技术路径 【免费下载链接】DepthCrafter DepthCrafter是一款开源工具&#xff0c;能为开放世界视频生成时间一致性强、细节丰富的长深度序列&#xff0c;无需相机姿态或光流等额外信息。助力视频深度估计任务&#xff0c;效…

作者头像 李华
网站建设 2026/5/9 18:28:10

Keymap Drawer终极指南:轻松创建专业级键盘布局可视化图表

Keymap Drawer终极指南&#xff1a;轻松创建专业级键盘布局可视化图表 【免费下载链接】keymap-drawer Visualize keymaps that use advanced features like hold-taps and combos, with automatic parsing 项目地址: https://gitcode.com/gh_mirrors/ke/keymap-drawer …

作者头像 李华
网站建设 2026/5/10 14:24:39

《全面解析:AI应用架构师眼中企业AI成本收益的多面性》

全面解析&#xff1a;AI应用架构师眼中企业AI成本收益的多面性 【阅读提示】 本文面向两类读者&#xff1a; • 正在或即将负责企业级 AI 落地的技术决策者&#xff08;CTO、架构师、技术总监&#xff09;。 • 对 AI 投资回报率&#xff08;ROI&#xff09;有量化诉求的业务/财…

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

NAPS2:重新定义文档数字化的工作方式

NAPS2&#xff1a;重新定义文档数字化的工作方式 【免费下载链接】naps2 Scan documents to PDF and more, as simply as possible. 项目地址: https://gitcode.com/gh_mirrors/na/naps2 还在为纸质文档的堆积如山而苦恼吗&#xff1f;NAPS2这款开源免费的跨平台扫描软件…

作者头像 李华
网站建设 2026/5/10 8:06:04

Windows 10/11环境下usblyzer使用核心要点解析

深入Windows 10/11&#xff1a;用 usblyzer 玩转USB协议分析的实战指南你有没有遇到过这样的场景&#xff1f;一个自定义HID设备插上电脑后&#xff0c;系统提示“无法启动”&#xff1b;或者U盘拷贝大文件时频繁超时&#xff0c;但换到别的机器又正常。你想查问题出在哪一层—…

作者头像 李华
网站建设 2026/5/10 13:44:08

NAPS2:告别纸质文档堆积的智能扫描革命

NAPS2&#xff1a;告别纸质文档堆积的智能扫描革命 【免费下载链接】naps2 Scan documents to PDF and more, as simply as possible. 项目地址: https://gitcode.com/gh_mirrors/na/naps2 还在为办公室堆积如山的纸质文件感到头疼吗&#xff1f;每天面对各种合同、发票…

作者头像 李华