找的时候,我们每次找2*num[i] + 1在BIT里的位置。一直找到root,就知道大于的数有多少个。这里二分找的是这个数字在排序数组种第一次出现的位置( the index of the first element in the copy array that is no less than itself)。譬如,[1, 1, 2, 3, 3],每次update,我们看到1,更新的是(1, 1)。因为“1”第一次出现在排序数组小标0处。所以在BIT,下标+1,所以是1,值为1,因为出现了一次。再譬如,3,下标是3,BIT里下表是4,值是1。
int[] BIT;
int n;
public int reversePairs(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
n = nums.length;
BIT = new int[n + 1];
int[] copy = Arrays.copyOf(nums, n);
Arrays.sort(copy);
int count = 0;
for (int i = 0; i < n; i++) {
int cur = nums[i];
count += search(index(copy, 2l * cur + 1));
update(index(copy, cur));
}
return count;
}
private void update(int i) {
while (i > 0) {
BIT[i] += 1;
i = i - (i & -i);
}
}
private int search(int i) {
int sum = 0;
while (i < n + 1) {
sum += BIT[i];
i = i + (i & -i);
}
return sum;
}
// 大神的二分,注意,这里return时候+1是因为返回的是BIT的下标
private int index(int[] arr, long val) {
int l = 0, r = arr.length - 1, m = 0;
while (l <= r) {
m = l + ((r - l) >> 1);
if (arr[m] >= val) {
r = m - 1;
} else {
l = m + 1;
}
}
return l + 1;
}