给你一个整数数组 nums ,按要求返回一个新数组 counts 。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。
示例 1:
输入:nums = [5,2,6,1]
输出:[2,1,1,0]
解释:
5 的右侧有 2 个更小的元素 (2 和 1)
2 的右侧仅有 1 个更小的元素 (1)
6 的右侧有 1 个更小的元素 (1)
1 的右侧有 0 个更小的元素
示例 2:
输入:nums = [-1]
输出:[0]
示例 3:
输入:nums = [-1,-1]
输出:[0,0]
public class Test08 {
public static List<Integer>countSmaller(int[] nums){
if(nums.length == 0){
return new ArrayList<>();
}
int min = Integer.MAX_VALUE;
for(int value : nums){
if(value < min){
min = value;
}
}
for(int i = 0;i<nums.length;i++){
nums[i] = nums[i] - min + 1;
}
int max = Integer.MIN_VALUE;
for(int value : nums){
if(value > max){
max = value;
}
}
int[] BITree = new int[max+1];
BITree[0] = 0;
int[] countArr = new int[nums.length];
for(int i = nums.length-1;i >= 0;i--){
int count = getSum(nums[i]-1,BITree);
countArr[i] = count;
update(nums[i],BITree);
}
List<Integer>result = new ArrayList<>();
for(int value : countArr){
result.add(value);
}
return result;
}
public static int getSum(int value, int[] BITree){
int sum = 0;
while(value > 0){
sum+= BITree[value];
value-=(value & -value);
}
return sum;
}
public static void update(int value,int[] BITree){
while(value<BITree.length-1){
BITree[value]+=1;
value+=(value &-value);
}
}
public static void main(String[] args) {
int[] num ={8,5,4,7,3,1};
System.out.println(countSmaller(num));
}
}