53.数组中的逆序对

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

输入一个数组,求出这个数组中的逆序对的总数。

数据范围:

给定数组的长度 [0,100]。

样例:

输入:[1,2,3,4,5,6,0]
输出:6

代码:

class Solution {
    //记录逆序对数量
    int res = 0;
    public int inversePairs(int[] nums) {
        //进行归并排序
        merge(nums,0,nums.length-1);
        //返回结果
        return res;
    }
    public void merge(int[] nums,int l,int r){
        //当l>=r时,直接返回
        if(l>=r)return;
        //计算中点
        int mid = l+r>>1;
        //递归处理左右半部分
        merge(nums,l,mid);
        merge(nums,mid+1,r);
        //创建临时数组存放合并结果
        int[] q = new int[r-l+1];
        //m为左半部分指针,n为右半部分指针
        int m = l,n = mid+1,cnt = 0;
        //合并两个有序数组
        while(m<=mid&&n<=r){
            //左元素 <= 右元素,不构成逆序对
            if(nums[m]<=nums[n])q[cnt++] = nums[m++];
             // 左元素 > 右元素,构成逆序对
            else {
                q[cnt++] = nums[n++];
                //当前左半部分剩余元素都与nums[n]构成逆序对
                res+= mid-m+1;
            }
        }
        //处理左半部分剩余元素
        while(m<=mid)q[cnt++] = nums[m++];
        //处理右半部分剩余元素
        while(n<=r)q[cnt++] = nums[n++];
        //将排序好的数组拷贝回原数组
        for(int i = l,j = 0;i<=r;i++,j++)nums[i] = q[j];
    }
}
posted @ 2025-05-30 09:01  回忆、少年  阅读(12)  评论(0)    收藏  举报