493.reverse-pairs.java 1.0 KB

1234567891011121314151617181920212223242526272829303132
  1. class Solution {
  2. private int[] aux;
  3. public int reversePairs(int[] nums) {
  4. aux = new int[nums.length];
  5. return mergeSort(nums, 0, nums.length - 1);
  6. }
  7. private int mergeSort(int[] nums, int beg, int end) {
  8. int res = 0;
  9. if (end <= beg) return res;
  10. int mid = beg + (end - beg) / 2;
  11. res += mergeSort(nums, beg, mid);
  12. res += mergeSort(nums, mid + 1, end);
  13. for (int i = beg, j = mid + 1; i <= mid; i++) {
  14. for (; j <= end && 2L * nums[j] < (long) nums[i]; j++);
  15. res += j - (mid + 1);
  16. }
  17. for (int i = beg, j = mid + 1, k = beg; k <= end; k++) {
  18. if (i == mid + 1) {
  19. aux[k] = nums[j++];
  20. } else if (j == end + 1) {
  21. aux[k] = nums[i++];
  22. } else {
  23. if (nums[i] < nums[j]) aux[k] = nums[i++];
  24. else aux[k] = nums[j++];
  25. }
  26. }
  27. System.arraycopy(aux, beg, nums, beg, end - beg + 1);
  28. return res;
  29. }
  30. }