题解 | #数组中的逆序对#
数组中的逆序对
http://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5
public class Solution {
sort(array,0,array.length-1);
return count%1000000007;
}
public void sort(int[] array,int left,int right){
if(left>=right){
return;
}
int mid = left + (right - left)/2;
sort(array,left,mid);
sort(array,mid+1,right);
merge(array,left,right);
}
public void merge(int[] array,int l,int r){
int mid = l+(r-l)/2;
int[] temp = new int[r-l+1];
int i = l,j = mid+1;
int k = 0;
while(i <= mid && j <= r){
if(array[i] < array[j]){
temp[k++] = array[i++];
count += j-mid-1;
count %= 1000000007;
}else{
temp[k++] = array[j++];
}
}
while(i<=mid){
temp[k++] = array[i++];
count += j-mid-1;
count %= 1000000007;
}
while(j<=r){
temp[k++] = array[j++];
}
for(int m = 0;m<temp.length;m++){
array[m+l] = temp[m];
}
}
}
int count = 0;
//归并排序
public int InversePairs(int [] array) {sort(array,0,array.length-1);
return count%1000000007;
}
public void sort(int[] array,int left,int right){
if(left>=right){
return;
}
int mid = left + (right - left)/2;
sort(array,left,mid);
sort(array,mid+1,right);
merge(array,left,right);
}
public void merge(int[] array,int l,int r){
int mid = l+(r-l)/2;
int[] temp = new int[r-l+1];
int i = l,j = mid+1;
int k = 0;
while(i <= mid && j <= r){
if(array[i] < array[j]){
temp[k++] = array[i++];
count += j-mid-1;
count %= 1000000007;
}else{
temp[k++] = array[j++];
}
}
while(i<=mid){
temp[k++] = array[i++];
count += j-mid-1;
count %= 1000000007;
}
while(j<=r){
temp[k++] = array[j++];
}
for(int m = 0;m<temp.length;m++){
array[m+l] = temp[m];
}
}
}