找的时候,我们每次找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) {return0; } 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 voidupdate(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;}