题解 | #数组中的逆序对#
数组中的逆序对
https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5
方法:归并排序
每次合并的时候,后半部分都要与前一部分进行比较,每次比较时出现后一部分值比前一部分大,就可以判断出现了逆序,逆序的大小为m-i+1;
public class Solution { int count=0; public int InversePairs(int [] array) { int l=0,h=array.length; if(h<2)return 0; mergeSort(array,l,h-1); return count; } public void mergeSort(int[]arr,int l,int h){ int m=l+(h-l)/2; if(l<h){ mergeSort(arr,l,m); mergeSort(arr,m+1,h); merge(arr,l,m,h); } } public void merge(int[]arr,int l,int m,int h){ int [] temp = new int[h-l+1]; int i=l,j=m+1; int index=0; while(i<=m&&j<=h){ if(arr[i]<arr[j]) temp[index++]=arr[i++]; else{ temp[index++]=arr[j++]; count+=m-i+1;//这里一定要是m-i+1而非m-l+1,因为i是动态变化的 count%=1000000007; } } while(i<=m) temp[index++]=arr[i++]; while(j<=h) temp[index++]=arr[j++]; for(int k=0;k<temp.length;k++) arr[k+l]=temp[k]; } }