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

   }
}
相关推荐
聚客AI11 小时前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
大怪v13 小时前
前端:人工智能?我也会啊!来个花活,😎😎😎“自动驾驶”整起!
前端·javascript·算法
惯导马工15 小时前
【论文导读】ORB-SLAM3:An Accurate Open-Source Library for Visual, Visual-Inertial and
深度学习·算法
骑自行车的码农17 小时前
【React用到的一些算法】游标和栈
算法·react.js
博笙困了17 小时前
AcWing学习——双指针算法
c++·算法
moonlifesudo18 小时前
322:零钱兑换(三种方法)
算法
NAGNIP1 天前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队2 天前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
Fanxt_Ja2 天前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下2 天前
最终的信号类
开发语言·c++·算法