在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
输入: [7,5,6,4]
输出: 5
限制:
0 <= 数组长度 <= 50000
思路:1、暴力。这种看上去简单的题,时间复杂度在O(n^2)之上的基本超时。
2、利用归并排序,整好好好复习了稳定的归并排序。
class Solution {
private int x = 0;
public int reversePairs(int[] nums) {
if(nums.length==0||nums.length==1) return 0;
int[] temp = new int[nums.length];
sort(nums,0,nums.length-1,temp);
return this.x;
}
public void merge(int[] a,int l,int mid ,int r,int[] temp){
int i = 0;
int p1 = l;
int p2 = mid+1;
while(p1<=mid && p2<=r){
this.x += a[p1]>a[p2] ? mid+1-p1:0;
temp[i++] = a[p1]<=a[p2] ? a[p1++]:a[p2++];
}
while(p1<=mid){
temp[i++] = a[p1++];
}
while(p2<=r){
temp[i++] = a[p2++];
}
System.arraycopy(temp,0,a,l,i);
}
public void sort(int[] a,int l,int r,int[] temp){
if(l>=r) return;
int mid= (l+r)/2;
sort(a,l,mid, temp);
sort(a,mid+1,r,temp);
merge(a,l,mid,r,temp);
}
}