剑指 Offer 51. 数组中的逆序对

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {

    private int[] helper;

    private int solve(int[] nums, int left, int right) {
        if (left >= right) {
            return 0;
        }
        int mid = (left + right) >> 1;
        int ans = solve(nums, left, mid) + solve(nums, mid + 1, right);
        int index = left;
        int p1 = left, p2 = mid + 1;
        while (p1 <= mid && p2 <= right) {
            if (nums[p1] > nums[p2]) {
                helper[index++] = nums[p2++];
                ans += mid - p1 + 1;
            } else {
                helper[index++] = nums[p1++];
            }
        }

        while (p1 <= mid) {
            helper[index++] = nums[p1++];
        }

        while (p2 <= right) {
            helper[index++] = nums[p2++];
        }

        System.arraycopy(helper, left, nums, left, right - left + 1);

        return ans;
    }

    public int reversePairs(int[] nums) {
        this.helper = new int[nums.length];
        return solve(nums, 0, nums.length - 1);
    }
}
posted @   Tianyiya  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示