题解 | #数组中的逆序对#
数组中的逆序对
https://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5
public class Solution { int cnt=0; public int InversePairs(int [] array) { if(array.length != 0){ divide(array,0,array.length-1); } return cnt; } public void divide(int[] array,int start,int end){ //递归终止条件 if(start >= end) return; //取中 int mid=start+(end-start)/2; //分 divide(array,start,mid); divide(array,mid+1,end); //治 merge(array,start,mid,end); } public void merge(int[] array,int start,int mid,int end){ //临时数组 int[] tmp=new int[end-start+1]; //i和j表示两个分数组的左下标,k表示临时数组的当前下标 int i=start,j=mid+1,k=0; while(i<=mid && j<= end){ //如果前小于后,则存前,前右移 if(array[i]<=array[j]){ tmp[k++]=array[i++]; } //如果前大于后,则存后,后右移-------***此时存在逆序对,要进行比较 else{ tmp[k++]=array[j++]; //如果此时前大于后,那么现有前到最后的元素都会大于后 cnt=(cnt+mid-i+1)%1000000007; } } //未遍历完的直接放在右侧 while(i<=mid){ tmp[k++]=array[i++]; } while(j<=end){ tmp[k++]=array[j++]; } // 将临时数组的值覆盖原来数组 for( k=0;k<tmp.length;k++){ array[start+k]=tmp[k]; } } }#归并排序#