1234567891011121314151617181920212223242526272829303132 |
- class Solution {
- private int[] aux;
- public int reversePairs(int[] nums) {
- aux = new int[nums.length];
- return mergeSort(nums, 0, nums.length - 1);
- }
- private int mergeSort(int[] nums, int beg, int end) {
- int res = 0;
- if (end <= beg) return res;
- int mid = beg + (end - beg) / 2;
- res += mergeSort(nums, beg, mid);
- res += mergeSort(nums, mid + 1, end);
- for (int i = beg, j = mid + 1; i <= mid; i++) {
- for (; j <= end && 2L * nums[j] < (long) nums[i]; j++);
- res += j - (mid + 1);
- }
- for (int i = beg, j = mid + 1, k = beg; k <= end; k++) {
- if (i == mid + 1) {
- aux[k] = nums[j++];
- } else if (j == end + 1) {
- aux[k] = nums[i++];
- } else {
- if (nums[i] < nums[j]) aux[k] = nums[i++];
- else aux[k] = nums[j++];
- }
- }
- System.arraycopy(aux, beg, nums, beg, end - beg + 1);
- return res;
- }
- }
|