题目
给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。
你需要返回给定数组中的重要翻转对的数量。
示例 1:
输入: [1,3,2,3,1]
输出: 2
示例 2:
输入: [2,4,3,5,1]
输出: 3
注意:
给定数组的长度不会超过50000。
输入数组中的所有数字都在32位整数的表示范围内。
链接:https://leetcode-cn.com/problems/reverse-pairs
解题记录
- 通过分治排序合并的过程中,通过比较找到满足条件的情况
class Solution {
public int reversePairs(int[] nums) {
return reversePairsHelper(nums, 0, nums.length - 1);
}
private int reversePairsHelper(int[] nums, int begin, int end) {
if (begin >= end) return 0;
int mid = begin + ((end - begin) >> 1);
int count = reversePairsHelper(nums, begin, mid) + reversePairsHelper(nums, mid + 1, end);
int[] cache = new int[end - begin + 1];
int index = 0, j = mid + 1, t = j;
for (int i = begin;i <= mid; i++) {
while (t <= end && ((long) nums[i]) > ((long) nums[t] << 1)) t++;
while (j <= end && nums[j] < nums[i]) cache[index++] = nums[j++];
cache[index++] = nums[i];
count += t - mid - 1;
}
System.arraycopy(cache, 0, nums, begin, index);
return count;
}
}