Fenwick over values
Time O(n log V) Space O(V)From right to left: answer = prefix(value − 1); then add 1 at value.
import java.util.*;
class Solution {
public List<Integer> countSmaller(int[] nums) {
int offset = 10001, size = 20003;
int[] bit = new int[size + 1];
Integer[] out = new Integer[nums.length];
for (int i = nums.length - 1; i >= 0; i--) {
int v = nums[i] + offset; // 1..20001
int count = 0;
for (int j = v - 1; j > 0; j -= j & -j) count += bit[j];
out[i] = count;
for (int j = v; j <= size; j += j & -j) bit[j]++;
}
return Arrays.asList(out);
}
}Verdict: Values are small, so no compression needed.