1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| public class Solution { private int res;
public int InversePairs(int[] array) { res = 0; if (array != null && array.length > 0) { divide(array, 0, array.length - 1); } return res; }
private void divide(int[] arr, int start, int end) { if (start >= end) return;
int mid = (end - start) / 2 + start; 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[] table = new int[end - start + 1];
int i = start, j = mid + 1, k = 0; while (i <= mid && j <= end) { if (arr[i] <= arr[j]) table[k++] = arr[i++]; else { table[k++] = arr[j++]; res = (res + mid - i + 1) % 1000000007; } }
while (i <= mid) table[k++] = arr[i++]; while (j <= end) table[k++] = arr[j++];
for (k = 0; k < table.length; ++k) { arr[start + k] = table[k]; } } }
|