# 计算右侧小于当前元素的个数

给你`一个整数数组 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]

 

提示:

## template ```java class Solution { public static List 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 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); } } } ``` ## 答案 ```java ``` ## 选项 ### A ```java ``` ### B ```java ``` ### C ```java ```