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]
.
Subscribe to see which companies asked this question
分析:参考网上的做法,采用BST结构是最直观和简单的。每个节点包括,左子树,右子树,值,以及count,count标记右边比root->val小的值。
创建根节点,每插入一个数,与节点比较,记右边比当前节点小的个数为m,比节点大,向右走,m+=m+root->count+1;往左走则root->count++;表示比root节点小,在右边的节点多一个。
代码如下:
class BST{
public:
int val;
int count;
BST* left;
BST*right;
BST(int i,int c=0):val(i),count(c),left(NULL),right(NULL){}
BST()=default;
};
void insert(BST*& root,int val, int& c )
{
if(root==NULL)
{
root=new BST(val);
return ;
}
if((root->val)<val)
{
c+=root->count+1;
insert(root->right,val,c);
}
else
{
root->count++;
insert(root->left,val,c);
}
}
class Solution {
public:
vector<int> countSmaller(vector<int>& nums) {
unsigned len=nums.size();
vector<int>result(len,0);
if(len==0) return result;
BST* root=new BST(nums[len-1],result[len-1]);
for(int i=len-2;i>=0;--i)
{
insert(root,nums[i],result[i]);
}
return result;
}
};