LeetcodeCount of Smaller Numbers After Self
Posted wuezs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetcodeCount of Smaller Numbers After Self相关的知识,希望对你有一定的参考价值。
题目链接:https://leetcode.com/problems/count-of-smaller-numbers-after-self/
题目:
You are given an integer array nums and you have to return a new counts array. The counts array has the property where 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.
Return the array [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;
}
以上是关于LeetcodeCount of Smaller Numbers After Self的主要内容,如果未能解决你的问题,请参考以下文章
LeetcodeCount of Smaller Numbers After Self
315. Count of Smaller Numbers After Self
LeetCode Count of Smaller Numbers After Self
Lintcode: Count of Smaller Number