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 48
| class Solution { int count = 0; public int reversePairs(int[] nums) { mergeSort(nums, 0, nums.length - 1); return count; } private void mergeSort(int[] nums, int left, int right) { if (left >= right) return ; int mid = left + (right - left) / 2; mergeSort(nums, left, mid); mergeSort(nums, mid + 1, right); merge(nums, left, mid, right); } private void merge(int[] nums, int left, int mid, int right) { int i = left; while (i <= mid) { int j = mid + 1; while (i <= mid) { while (j <= right && (long) nums[i] > 2 * (long) nums[j]) { j++; } count += j - mid - 1; i++; } } i = left; int j = mid + 1, k = 0; int[] arr = new int[right - left + 1]; while(i <= mid || j <= right) { if (i > mid) { arr[k++] = nums[j++]; } else if (j > right) { arr[k++] = nums[i++]; } else { if (nums[i] <= nums[j]) { arr[k++] = nums[i++]; } else { arr[k++] = nums[j++]; } } } k = 0; while (k < arr.length) { nums[left++] = arr[k++]; } } }
|