private static int biggerThanRightTwice(int[] arr) {
if (null == arr || arr.length<2) {
return 0 ;
}
return process(arr,0,arr.length-1);
}
private static int process(int[] arr,int l , int r ) {
if (l ==r) {
return 0;
}
int mid =l + ((r-l)>>1);
return process(arr,l,mid)+ process(arr,mid+1,r)+merge(arr,l,mid,r);
}
private static int merge(int[] arr, int l, int mid, int r) {
int [] help = new int[r-l+1];
int index = 0;
int p1 = l;
int p2 =mid+1;
int ans = 0;
int winL = p1 ;
int winR = p2 ;
for (int i = winL; i <=mid ; i++) {
while (winR<=r && arr[i]>(arr[winR]<<1)){
winR++;
}
ans += winR-p2;
}
while (p1<=mid && p2 <=r) {
help[index++] = arr[p1]<=arr[p2]?arr[p1++]:arr[p2++];
}
while (p1<=mid ) {
help[index++] = arr[p1++];
}
while ( p2 <=r) {
help[index++] = arr[p2++];
}
for (int i = 0; i < help.length; i++) {
arr[l+i]=help[i];
}
return ans ;
}
右边数两倍比左边数还小的个数biggerThanRightTwice
最新推荐文章于 2024-07-23 17:36:37 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)