【归并】数组中的逆序对

求解代码

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);
    }
相关推荐
FQNmxDG4S8 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
超级码力6668 小时前
【Latex文件架构】Latex文件架构模板
算法·数学建模·信息可视化
穿条秋裤到处跑8 小时前
每日一道leetcode(2026.04.29):二维网格图中探测环
算法·leetcode·职场和发展
Merlos_wind9 小时前
HashMap详解
算法·哈希算法·散列表
虹科网络安全9 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje9 小时前
Java语法进阶
java·开发语言·jvm
汉克老师9 小时前
GESP2025年3月认证C++五级( 第三部分编程题(1、平均分配))
c++·算法·贪心算法·排序·gesp5级·gesp五级
rKWP8gKv79 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫9 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287929 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日