题意:给定一个数组nums,返回i坐标往后的比nums[i]小的数
思路:用二叉搜索树,两个数值域:val和count,val表示nums[i]的值,count表示该节点左子树节点的数量。从后向前,如果向左,则上一层的count++,如果向右,则ans+=1+root->count,存入ans数组即可。
代码如下:
class Solution {
public:
struct Node{
int val;
int count;
Node *left,*right;
Node(int v,int c):val(v),count(c),left(NULL),right(NULL){}
};
vector<int> countSmaller(vector<int>& nums) {
vector<int> ans(nums.size(),0);
int i,j,k,d=0;
Node *root,*temp,*w;
if(nums.size()==0) return ans;
root=new Node(nums[nums.size()-1],0);
ans[nums.size()-1]=0;
for(i=nums.size()-2;i>=0;i--)
{
temp=root;
j=0;
while(true)
{
if(nums[i]>temp->val)
{
d=1;
j=j+temp->count+1;
}
else
{
temp->count++;
d=0;
}
if(d==1)
{
if(temp->right==NULL)
{
temp->right=new Node(nums[i],0);
break;
}
else temp=temp->right;
}
else if(d==0)
{
if(temp->left==NULL)
{
temp->left=new Node(nums[i],0);
break;
}
else temp=temp->left;
}
}
ans[i]=j;
}
return ans;
}
};