归并排序:剑指 Offer 51. 数组中的逆序对
题目描述:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
限制:
0 <= 数组长度 <= 50000
合并阶段 本质上是 合并两个排序数组 的过程,而每当遇到 左子数组当前元素 > 右子数组当前元素 时,
意味着 「左子数组当前元素 至 末尾元素」 与 「右子数组当前元素」 构成了若干 「逆序对」 。
因此,考虑在归并排序的合并阶段统计「逆序对」数量,完成归并排序时,也随之完成所有逆序对的统计。
lass Solution{ int[] nums,tmp; public int reversePairs(int nums[]){ this.nums=nums; tmp=new int[nums.length]; return mergeSort(0,nums.length-1); } public int mergeSort(int l,int r){ if(l>=r) return 0;//终止条件 int m = (l+r)/2; int res = mergeSort(l,m)+mergeSort(m+1,r);//递归划分 int i=l,j=m+1; for(int k=l;k<=r;k++){ //暂存数组 nums 闭区间 [i, r]内的元素至辅助数组 tmp tmp[k] = nums[k]; } for(int k=l;k<=r;k++){//循环合并 if(i==m+1){ nums[k]=tmp[j++]; }else if(j==r+1||tmp[i]<=tmp[j]){ nums[k]=tmp[i++]; }else { nums[k]=tmp[j++]; res+=m-i+1; } } return res;// 返回直至目前的逆序对总数 res } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!