news 2026/4/16 16:06: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/4/16 1:41:55

Zotero Attachment Manager 智能附件管理完全指南

Zotero Attachment Manager 智能附件管理完全指南 【免费下载链接】zotero-attanger Attachment Manager for Zotero 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-attanger 还在为Zotero中杂乱无章的附件文件而头痛吗&#xff1f;Zotero Attachment Manager&am…

作者头像 李华
网站建设 2026/4/16 12:17:40

ms-swift框架下模型版权保护与水印嵌入技术

ms-swift框架下模型版权保护与水印嵌入技术 在大模型日益成为核心数字资产的今天&#xff0c;一场关于“谁拥有这个权重文件”的争议正悄然升温。训练一个千亿参数级别的语言模型动辄耗费数百万美元算力成本&#xff0c;但其成果——一串 .safetensors 文件——却能在几秒内被复…

作者头像 李华
网站建设 2026/4/16 10:56:11

如何通过ms-swift实现航空航天数据分析?

如何通过ms-swift实现航空航天数据分析&#xff1f; 在高轨卫星自主避障、飞行器异常诊断和空管智能决策日益依赖AI的今天&#xff0c;一个核心问题摆在工程师面前&#xff1a;如何让大模型真正“理解”复杂多模态数据&#xff0c;并在资源受限的环境下稳定运行&#xff1f;传统…

作者头像 李华
网站建设 2026/4/16 9:20:00

代码驱动的3D革命:OpenSCAD如何重新定义机械设计

代码驱动的3D革命&#xff1a;OpenSCAD如何重新定义机械设计 【免费下载链接】openscad OpenSCAD - The Programmers Solid 3D CAD Modeller 项目地址: https://gitcode.com/gh_mirrors/op/openscad 在传统CAD软件主导的3D建模领域&#xff0c;一款名为OpenSCAD的工具正…

作者头像 李华
网站建设 2026/4/16 9:24:42

Cemu模拟器完整配置指南:从入门到精通快速上手

Cemu模拟器完整配置指南&#xff1a;从入门到精通快速上手 【免费下载链接】Cemu Cemu - Wii U emulator 项目地址: https://gitcode.com/GitHub_Trending/ce/Cemu 你是否曾经遇到过这样的困扰&#xff1a;下载了Cemu模拟器却不知道如何配置&#xff0c;游戏运行卡顿频繁…

作者头像 李华
网站建设 2026/4/16 12:34:14

终极Windows自动化安装指南:快速打造纯净系统环境

终极Windows自动化安装指南&#xff1a;快速打造纯净系统环境 【免费下载链接】UnattendedWinstall Personalized Unattended Answer File that helps automatically debloat and customize Windows 10 & 11 during the installation process. 项目地址: https://gitcode…

作者头像 李华