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
| class Solution { public int reversePairs(int[] record) { int[] tmp = new int[record.length]; return mergeSort(record, tmp,0, record.length - 1); }
private int mergeSort(int[] record, int[] tmp, int left, int right) { if (left >= right) { return 0; }
int mid = (left + right) >>> 1; int reversePairs = 0; reversePairs += mergeSort(record, tmp, left, mid); reversePairs += mergeSort(record, tmp, mid + 1, right);
for (int i = left; i <= right; i++) { tmp[i] = record[i]; }
int i = left, j = mid + 1; for (int k = left; k <= right; k++) { if (i == mid + 1) { record[k] = tmp[j++]; } else if (j == right + 1) { record[k] = tmp[i++]; } else if (tmp[i] <= tmp[j]) { record[k] = tmp[i++]; } else { record[k] = tmp[j++]; reversePairs += mid - i + 1; } }
return reversePairs; } }
|