题目链接:https://leetcode.com/problems/count-of-smaller-numbers-after-self/
题目:
counts[i]
is the number of smaller elements to the right of nums[i]
.
Example:
Given nums = [5, 2, 6, 1]
To the right of 5 there are 2 smaller elements (2 and 1).
To the right of 2 there is only 1 smaller element (1).
To the right of 6 there is 1 smaller element (1).
To the right of 1 there is 0 smaller element.
[2, 1, 1, 0]
.
思路:
建立一个二叉搜索树,在建树的过程中,记录在数组右边比自身小的元素个数。 算法复杂度O(nlogn),用动态规划复杂度为O(n^2)。
其中cnt为该结点相同大小元素的个数,用于重复元素判断。。。其实可以省略。。懒得改了
算法:
public List<Integer> countSmaller(int[] nums) {
List<Integer> list = new ArrayList<Integer>();
int res[] = new int[nums.length];
for (int i = nums.length - 1; i >= 0; i--) {
res[i] = insert(nums[i]);
}
for (int i : res) {
list.add(i);
}
return list;
}
TreeNode tRoot;
private Integer insert(int val) {
int cnt = 0;
if (tRoot == null) {
tRoot = new TreeNode(val);
return cnt;
}
TreeNode root = tRoot;
while (root != null) {
if (val < root.val) {
root.leftCnt++;
if (root.left == null) {
root.left = new TreeNode(val);
break;
} else
root = root.left;
} else if (val > root.val) {
cnt += root.leftCnt + root.cnt;
if (root.right == null) {
root.right = new TreeNode(val);
break;
} else
root = root.right;
} else {
cnt += root.leftCnt;
root.cnt++;
break;
}
}
return cnt;
}