0493. Reverse Pairs
Description
**Input:** nums = [1,3,2,3,1]
**Output:** 2**Input:** nums = [2,4,3,5,1]
**Output:** 3ac
class Solution {
public int reversePairs(int[] nums) {
// edge cases
if (nums == null || nums.length <= 1) return 0;
int n = nums.length;
int[] bit = new int[n+1];
int[] reverseSorted = new int[n]; // 3,3,2,1,1
int[] copy = Arrays.copyOf(nums, n);
Arrays.sort(copy);
for (int i = 0; i < n; i++) reverseSorted[i] = copy[n-1-i];
int res = 0;
for (int i = 0; i < n; i++) {
res += getSum(bit, getBitIndex(reverseSorted, nums[i] * 2l)-1);
update(bit, getBitIndex(reverseSorted, nums[i]));
}
return res;
}
private int getBitIndex(int[] nums, long val) {
// binary search get first index <= val, because we want to find element > val
int l = 0, r = nums.length-1;
while (l + 1 < r) {
int mid = l + (r - l) / 2;
if (nums[mid] <= val) r = mid;
else l = mid;
}
int res = nums[l] <= val ? l : nums[r] <= val ? r : r + 1;
return res + 1; // it's actually returning the rank
}
private int getSum(int[] bit, int i) {
int res = 0;
while (i > 0) {
res += bit[i];
i -= i & (-i);
}
return res;
}
private void update(int[] bit, int i) {
while (i < bit.length) {
bit[i]++;
i += i & (-i);
}
}
}
/*
1,3,2,3,1
3,3,2,1,1
2,6,4,6,2
2,4,3,5,1
5,4,3,2,1
4,8,6,10,2
*/ac2: merge
Last updated