-
题目描述:
给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。1
在做这题之前我们先看一下剑指Offer上的一道题:数组中的逆序对
-
回顾:数组中的逆序对:
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。2- 分析:
- 借助数组的排序规律,进行求解,例如index处的值nums[index]向后移动x步到合适的位置,那么和nums[index]有关的逆序对(和移动后的数相比nums[index]是较小的数)一共有x对.
- 因此,我们需要对数组进行排序,在排序过程中统计当前位置有多少对逆序对
- 采用基于归并排序的思路进行求解,与归并排序代码相比,只多了计数的一句代码
- 代码部分:
- 分析:
int[] temp;
int count = 0;
public int reversePairs(int[] nums) {
if(nums.length <= 1) return 0;
int len = nums.length;
temp = new int[len];
mergesort(nums,0,len-1);
return count;
}
public void mergesort(int[] nums,int l,int r){
if(l >= r) return;
int mid = l + (r - l)/2;
mergesort(nums,l,mid);
mergesort(nums,mid + 1,r);
merge(nums,l,mid,r);
}
public void merge(