【归并】数组中的逆序对

求解代码

java 复制代码
    int mod = 1000000007;

    long mergeSort(int[] nums, int left, int right) {
        if (left >= right) {
            return 0;
        }

        int mid = left + ((right - left) >> 1);
        // 分治计算左右区间,并立即取模
        long res = (mergeSort(nums, left, mid) + mergeSort(nums, mid + 1, right)) % mod;
        
        int[] temp = new int[right - left + 1];
        int i = left;
        int j = mid + 1;
        int k = 0;

        while (i <= mid && j <= right) {
            // 严格判断nums[i] <= nums[j],仅大于时统计逆序对
            if (nums[i] <= nums[j]) {
                temp[k++] = nums[i++];
            } else {
                temp[k++] = nums[j++];
                // 累加后立即取模,防止溢出
                res = (res + mid - i + 1) % mod;
            }
        }
        // 拷贝左区间剩余元素
        while (i <= mid) {
            temp[k++] = nums[i++];
        }
        // 拷贝右区间剩余元素
        while (j <= right) {
            temp[k++] = nums[j++];
        }
        // 覆盖回原数组
        for (k = 0, i = left; k < temp.length; k++, i++) {
            nums[i] = temp[k];
        }
        return res;
    }

    public int InversePairs(int[] nums) {
        if (nums == null || nums.length <= 1) {
            return 0;
        }
        return (int) (mergeSort(nums, 0, nums.length - 1) % mod);
    }
相关推荐
SamDeepThinking几秒前
为什么我会主动给一个年轻程序员加薪、晋升?
java·后端·程序员
来一碗刘肉面5 分钟前
C++中的引用语法
c++·算法
ikun_文12 分钟前
Java面向对象编程OOP核心知识
java
A.零点19 分钟前
期末复习,408考研数据结构:第一章绪论完整知识梳理与真题深度解读
c语言·数据结构·笔记·考研
宠友信息22 分钟前
MySQL 租户数据隔离在即时通讯源码后端中的落地方式
java·数据库·spring boot·redis·websocket·mysql
Black蜡笔小新28 分钟前
自动化AI算法训练服务器DLTM零代码私有化赋能智慧农业用AI智能视觉守护万亩良田
人工智能·算法·自动化
AI人工智能+电脑小能手29 分钟前
【大白话说Java面试题 第163题】【06_Spring篇】第23题:说说SpringBoot 自动配置原理?
java·自动配置·springboot·spi·条件注解
江湖有缘33 分钟前
【保姆级教程】使用Docker Compose一键搭建Picsur私有图床服务
java·docker·容器
Tisfy1 小时前
LeetCode 1288.删除被覆盖区间:排序(非二重循环暴力)
算法·leetcode·题解·排序
一路向北North1 小时前
Spring Security OAuth2.0(18):资源服务测试
java·后端·spring