import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.List;
class Solution {
class Node{
Node left;
Node right;
int val;
int count;
int dup;
public Node(int v, int s){
val = v;
count = s;
dup = 1;
}
}
public List<Integer> countSmaller(int[] nums) {
Integer[] res = new Integer[nums.length];
Node root = null;
for (int i = nums.length - 1; i >= 0; i--){
root = insert(nums[i], root, res, i, 0);
}
return Arrays.asList(res);
}
private Node insert(int num, Node node, Integer[] res, int i, int preCount){
if (node == null){
node = new Node(num, 0);
res[i] = preCount;
}
else if (node.val == num){
node.dup++;
res[i] = preCount + node.count;
}
else if (node.val > num){
node.count++;
node.left = insert(num, node.left, res, i, preCount);
}
else {
node.right = insert(num, node.right, res, i, preCount + node.count + node.dup);
}
return node;
}
}
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution {
public List<Integer> countSmaller(int[] nums) {
int[] smaller = new int[nums.length];
int[] pos = new int[nums.length];
for (int i = 0; i < pos.length; i++){
pos[i] = i;
}
sort(nums, pos, smaller, 0, nums.length - 1);
List<Integer> res = new ArrayList<>();
for (int i = 0 ; i < smaller.length; i++){
res.add(smaller[i]);
}
return res;
}
private void sort(int[] nums, int[] pos, int[] smaller, int from, int to){
if (from >= to)
return;
int mid= (from + to) / 2;
sort(nums, pos, smaller, from, mid);
sort(nums, pos, smaller, mid + 1, to);
int[] merge = new int[to - from + 1];
int i = from;
int j = mid + 1;
int k = 0;
int jump = 0;
while (i <= mid && j <= to){
if (nums[pos[i]] <= nums[pos[j]]){
merge[k] = pos[i];
smaller[pos[i]] += jump;
i++;
}
else {
merge[k] = pos[j];
jump++;
j++;
}
k++;
}
while (i <= mid){
merge[k] = pos[i];
smaller[pos[i]] += jump;
i++;
k++;
}
while (j <= to){
merge[k] = pos[j];
j++;
k++;
}
for (int i2 = from; i2 < to; i2++){
pos[i2] = merge[i2 - from];
}
}
}