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)完成之后立刻返回。