暴力超时
public class Solution { public int InversePairs(int [] array) { int res = 0; for(int i=array.length-1; i>=0;i--){ for(int j=i-1;j>=0;j--){ if(array[i]<array[j]) res++; } res = res%1000000007; } return res; } }
归并
在归并排序的合并过程中
157,269
当出现 逆序 5,2时
从5开始统计 5后面的 middle的前面 即5,7 全部是比2大的逆序数
在整个数组有序的过程中, 就可以统计逆序数对
import java.util.*; public class Solution { int[] nums, temp; public int InversePairs(int [] array) { this.nums = array; temp = new int[nums.length]; return mergersort(0,array.length-1); } public int mergersort(int l, int r){ if(l>=r) return 0; // 划分 int m = (l+r+1)/2; int res = mergersort(l, m-1) + mergersort(m, r); for(int i=l;i<=r;i++){ temp[i] = nums[i]; } int i = l; int j = m; // 合并 // 注意必须要 i == m j == r+1 在前面 //否则的话 当判断到temp[i] <= temp[j] ij会超出数组范围 for(int k=l;k<=r;k++){ if(i == m) nums[k] = temp[j++]; else if(j == r+1) nums[k] = temp[i++]; else if(temp[i] <= temp[j]) nums[k] = temp[i++]; else{ res = (res + m - i) % 1000000007; nums[k] = temp[j++]; } } return res; } }