剑指offer JZ51 数组中的逆序对

描述

剑指offer JZ51 数组中的逆序对

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P mod 1000000007

方法:归并排序分治

思路:

利用归并排序统计逆序对

具体实现及注释:

java 复制代码
public class Solution {
   //归并排序中的临时数组
   int[] temp;
   //目标数组
   int[] nums;
   int mod = 1000000007;

   public int InversePairs (int[] nums) {
       if (nums == null || nums.length == 0) return 0;
       this.nums = nums;
       temp = new int[nums.length];
       return mergeSort(0, nums.length-1);
   }

   int mergeSort(int head, int tail) {
       //退出递归的条件
       if (head == tail) return 0;
       int mid = (head + tail) / 2;
       //左边递归
       int leftNum = mergeSort(head, mid);
       //右边递归
       int rightNum = mergeSort(mid+1, tail);
       //向临时数组中复制元素
       for (int i = head; i <= tail; i++) {
           temp[i] = nums[i];
       }
       int left = head;
       int right = mid + 1;
       int count = 0;
       //在归并排序中,需要将左边的元素和右边的元素比较,谁小谁先回到原数组。但是此题还要统计逆序对。因为左半部分和右半部分的元素已经有序,如果在遍历过程中,右半部分的元素比左半部分的元素更小,说明出现了逆序对。此时左半部分的元素为left,在左半部分中比left还大的元素个数为mid-left,右半部分的right比left小,肯定比剩下mid-left个元素都小,所以逆序对有mid-left+1个。
       for (int i = head; i <= tail; i++) {
           //这种情况是左半部分的元素全部入队,此时右半部分的元素正常入队即可
           if (left == mid+1) nums[i] = temp[right++];
           //需要左半部分元素一次入队的情况
           else if (right == tail+1 || temp[left] < temp[right]) nums[i] = temp[left++];
           //出现逆序对
           else {
               nums[i] = temp[right++];
               count = (count + mid - left + 1) % mod;
           }
       }
       return (leftNum + rightNum + count) % mod;

   }
}
相关推荐
wuweijianlove18 分钟前
算法性能的渐近与非渐近行为对比的技术4
算法
_dindong26 分钟前
cf1091div2 C.Grid Covering(数论)
c++·算法
AI成长日志26 分钟前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
黎阳之光1 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
skywalker_111 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
6Hzlia1 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
wfbcg1 小时前
每日算法练习:LeetCode 209. 长度最小的子数组 ✅
算法·leetcode·职场和发展
_日拱一卒2 小时前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode
计算机安禾2 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio
SatVision炼金士2 小时前
合成孔径雷达干涉测量(InSAR)沉降监测算法体系
算法