0
点赞
收藏
分享

微信扫一扫

剑指Offer刷题(牛客网)数组中最小的逆序对

kolibreath 2023-01-21 阅读 54



题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字

数据范围:

对于%50的数据,size<=10^4

对于%75的数据,size<=10^5

对于%100的数据,size<=2*10^5

1.利用归并排序

public class Solution {
int count;
public int InversePairs(int [] array) {
if(array.length!=0){
mergeSort(array,0,array.length-1);
}
return count;
}

public void mergeSort(int[] arr,int left,int right){
if(left<right){
int mid = left+(right-left)/2;
mergeSort(arr,left,mid);
mergeSort(arr,mid+1,right);
merge(arr,left,mid,right);
}

}
public void merge(int[] arr,int left,int mid,int right){
int l = left;
int r = mid+1;
int i = 0;
int[] help = new int [right-left+1];
while(l<=mid&&r<=right){
if(arr[l]<=arr[r]){
help[i++] = arr[l++];
}else{
help[i++] = arr[r++];
count = (count+mid-l+1)%1000000007;
}
}
while(l<=mid){
help[i++] = arr[l++];
}
while(r<=right){
help[i++] = arr[r++];
}
for( i = 0;i<right-left+1;i++){
arr[left+i] = help[i];
}

}
}


举报

相关推荐

0 条评论