题目描述
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007
输入描述:
题目保证输入的数组中没有的相同的数字
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
题目链接:
归并排序
public class Solution { private int count =0; public int InversePairs(int [] array) { if(array.length == 0){ return 0; } recursive(array,new int[array.length],0,array.length - 1); return count; } //归并排序 public void recursive(int[] arr,int[] tarr,int left,int right){ if(left == right){ return; } int mid = (left + right)/2; //左边排序 recursive(arr,tarr,left,mid); //右边排序 recursive(arr,tarr,mid+1,right); int m = left,n = mid+1; for(int i = left;i <= right;i++){ //左右两个子数组依次排列 if(arr[m] >= arr[n]){ tarr[i] = arr[n]; n++; count += mid - m + 1; count %= 1000000007; }else{ tarr[i] = arr[m]; m++; } //只剩右边子数组时 if(m>mid){ while(n<=right){ tarr[++i]=arr[n++]; } break; } //只剩左边子数组时 if(n>right){ while(m<=mid){ tarr[++i]=arr[m++]; } break; } } for(int i = left;i<=right;i++){ arr[i] = tarr[i]; } } }
插入排序:过75%数据
public class Solution { public int InversePairs(int [] array) { if(array.length<=1){ return 0; } int count = 0; for(int i = 1;i < array.length;i++){ for(int j = i - 1;j >= 0;j--){ if(array[j] > array[j+1]){ count++; swap(array,j+1,j); }else{ break; } } count%=1000000007; } return count; } public void swap(int[] arr,int i,int j){ int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } }