输入描述:
题目保证输入的数组中没有的相同的数字。
数据范围:
对于%50的数据,size<=10^4
对于%75的数据,size<=10^5
对于%100的数据,size<=2*10^5
思路
分治法,归并排序。
时间复杂度O(nlgn),空间复杂度O(n)。
代码
public class Solution {
private int val;
private int[] tmp;
//二路归并
private void divide(int[] arr, int start, int end) {
if(start >= end) return;
int mid = (start + end) >> 1;
divide(arr, start, mid);
divide(arr, mid + 1, end);
merge(arr, start, mid, end);
}
//归并排序
private void merge(int[] arr, int start, int mid, int end) {
int k = 0, l = start, r = mid + 1;
while(l <= mid && r <= end) {
//原归并排序的核:tmp[k++] = arr[l] < arr[r] ? arr[l++] : arr[r++];
if(arr[l] > arr[r]) {
val = (val + mid + 1 - l)%1000000007;
tmp[k++] = arr[r++];
} else {
tmp[k++] = arr[l++];
}
}
while(l <= mid) tmp[k++] = arr[l++];
while(r <= end) tmp[k++] = arr[r++];
for(int i = start; i <= end; i++) {
arr[i] = tmp[i-start];
}
}
public int InversePairs(int [] array) {
if(array == null || array.length == 0) return 0;
val = 0;
tmp = new int[array.length];
divide(array, 0, array.length-1);
return val;
}
}
笔记
递归先写递归出口,再写递归运行框架,最后实现递归操作细节。