news 2026/7/13 17:39:07

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

作者头像

张小明

前端开发工程师

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/7/10 3:52:11

终极指南:如何使用Pcileech-DMA-NVMe-VMD实现免费VMD固件替代方案

终极指南&#xff1a;如何使用Pcileech-DMA-NVMe-VMD实现免费VMD固件替代方案 【免费下载链接】Pcileech-DMA-NAMe-VMD Firmware emulation to implement NVMe-VMD functionality 项目地址: https://gitcode.com/gh_mirrors/pc/Pcileech-DMA-NAMe-VMD 还在为昂贵的VMD固…

作者头像 李华
网站建设 2026/7/4 21:30:55

Goldberg Steam Emulator 终极使用指南:5分钟快速上手局域网游戏

Goldberg Steam Emulator 终极使用指南&#xff1a;5分钟快速上手局域网游戏 【免费下载链接】gbe_fork Fork of https://gitlab.com/Mr_Goldberg/goldberg_emulator 项目地址: https://gitcode.com/gh_mirrors/gbe/gbe_fork Goldberg Steam Emulator&#xff08;简称GB…

作者头像 李华
网站建设 2026/7/1 0:27:58

W5500以太网模块SPI接口配置:STM32平台手把手教程

手把手教你搞定W5500 STM32以太网通信&#xff1a;从原理图到SPI驱动全解析你有没有遇到过这样的场景&#xff1f;项目需要给一个工业设备加上网口&#xff0c;想用最稳定、最低CPU占用的方式实现联网功能。软件协议栈太吃资源&#xff0c;裸机跑LwIP又复杂得让人头大……这时…

作者头像 李华
网站建设 2026/7/1 11:58:12

ms-swift框架下自动驾驶场景下的多模态感知

ms-swift框架下自动驾驶场景的多模态感知实践 在城市高架桥的早高峰时段&#xff0c;一辆自动驾驶汽车正面临复杂决策&#xff1a;左侧是缓慢变道的货车&#xff0c;前方施工区闪烁着警示灯&#xff0c;导航提示“右转绕行”&#xff0c;而乘客轻声说了一句“走最左边车道”。如…

作者头像 李华
网站建设 2026/7/1 21:03:16

如何利用ms-swift进行模型重排序(Reranker)训练?

如何利用 ms-swift 进行模型重排序&#xff08;Reranker&#xff09;训练&#xff1f; 在当前大模型驱动的搜索、推荐与问答系统中&#xff0c;一个明显的趋势正在发生&#xff1a;传统的“检索即结果”模式已无法满足用户对精准性和语义理解深度的需求。越来越多的系统开始采用…

作者头像 李华
网站建设 2026/7/7 17:16:04

DLSS-Enabler终极指南:让AMD和Intel显卡免费体验DLSS黑科技

DLSS-Enabler终极指南&#xff1a;让AMD和Intel显卡免费体验DLSS黑科技 【免费下载链接】DLSS-Enabler Simulate DLSS Upscaler and DLSS-G Frame Generation features on any DirectX 12 compatible GPU in any DirectX 12 game that supports DLSS2 and DLSS3 natively. 项…

作者头像 李华