这串递归代码非常烧脑,先贴出来,慢慢研究,求逆序数,还可以用变形的mergesort:
class Node {
int key;
int smaller;
int duplicates;
Node left, right;
public Node(int key, int smaller) {
this.key = key;
this.smaller = smaller;
this.duplicates = 1;
}
}
private Node put(Node root, int key, Integer[] answer, int index, int smaller) {
if (root == null) {
answer[index] = smaller;
return new Node(key, 0);
}
if (key < root.key) {
root.smaller++;
root.left = put(root.left, key, answer, index, smaller);
} else if (key > root.key) {
root.right = put(root.right, key, answer, index, smaller + root.smaller + root.duplicates);
} else {
root.duplicates++;
answer[index] = smaller + root.smaller;
}
return root;
}
public List<Integer> countSmaller(int[] nums) {
int n = nums.length;
Integer[] answer = new Integer[n];
Node root = null;
for (int i = n - 1; i >= 0; i--) {
root = put(root, nums[i], answer, i, 0);
}
return Arrays.asList(answer);
}