剑指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;

   }
}
相关推荐
胡小禾2 小时前
JDK17和JDK8的 G1
jvm·算法
胖咕噜的稞达鸭4 小时前
算法入门:专题攻克一---双指针(3)有效三角形的个数 查找总价格为目标值的两个商品(剑指offer题目)
算法
逻辑留白陈8 小时前
Adaboost进阶:与主流集成算法对比+工业级案例+未来方向
算法
Learn Beyond Limits8 小时前
Mean Normalization|均值归一化
人工智能·神经网络·算法·机器学习·均值算法·ai·吴恩达
天选之女wow9 小时前
【代码随想录算法训练营——Day28】贪心算法——134.加油站、135.分发糖果、860.柠檬水找零、406.根据身高重建队列
算法·leetcode·贪心算法
Gohldg9 小时前
C++算法·贪心例题讲解
c++·数学·算法·贪心算法
远远远远子9 小时前
类与对象 --1
开发语言·c++·算法
Aaplloo9 小时前
【无标题】
人工智能·算法·机器学习
西望云天9 小时前
The 2024 ICPC Asia Nanjing Regional Contest(2024南京区域赛EJKBG)
数据结构·算法·icpc
10岁的博客9 小时前
容器化安装新玩法
算法