2021-09-03剑指Offer51.数组中的逆序对

这篇文章介绍了一种使用递归和归并排序的方法来解决LeetCode中反转对问题。核心是通过合并过程中记录交换次数来计算逆序对。作者展示了如何在Solution类中实现mergeSort方法和处理边界情况,适合初学者理解排序算法在实际问题中的应用。
摘要由CSDN通过智能技术生成

在这里插入图片描述


class Solution {
    int[] nums, tmp;
    //表示未分配长度的数组指针?
    //java的默认权限是共有还是私有?
    public int reversePairs(int[] nums) {
        this.nums = nums;
        tmp = new int[nums.length];
        //到底是length()还是length
        return mergeSort(0, nums.length - 1);
    }
    private int mergeSort(int l, int r) {
        // 终止条件
        if (l >= r) return 0;
        //拆分到只有0个或者一个就终止递归
        // 递归划分
        int m = (l + r) / 2;
        int res = mergeSort(l, m) + mergeSort(m + 1, r);
        // 合并阶段
        int i = l, j = m + 1;
        //i为左边数组开头的指针,j为右边数组开头的指针
        for (int k = l; k <= r; k++)
            tmp[k] = nums[k];
            //将子串拷贝到一个暂时存储起来
            //为什么需要这样做呢?
        for (int k = l; k <= r; k++) {
            if (i == m + 1)
                nums[k] = tmp[j++];
                //如果左边开头的指针和右边数组开头的指针重合,说明没有逆序对,直接将右边的数组放入原来的数组当中
            else if (j == r + 1 || tmp[i] <= tmp[j])
                nums[k] = tmp[i++];
                //第一个条件判断说明右边的已经放完了,
                //第二个条件判断说明左边的一直小于右边的,不断的将左边的放入数组即可
            else {
                nums[k] = tmp[j++];
                res += m - i + 1; // 统计逆序对
                //右边的较小,放入右边的,此时左边指针所指向的数字和左边数组末尾所构成的区间所有的都比右边的大,都可以组成逆序对
            }
        }
        return res;
    }
}

作者:jyd
链接:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/solution/jian-zhi-offer-51-shu-zu-zhong-de-ni-xu-pvn2h/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

基础思想是在递归合并的时候计算交换的次数来获得逆序对的个数。
具体的调用过程如下:以长度为4的数组为例。
merg(0,3)
merg(0,1)
merg(0,0)//此时只有一个字符,立即返回
然后进入到右枝,merg(1,1)完成之后立刻返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值