题解 | #维护x的秩#
维护x的秩
http://www.nowcoder.com/practice/0ade0d95c85349beb934a90b1d9b02be
要求随着数字的到来统计之前所有比当前小的数字的数目
通过维护一棵二叉搜索树来实现,树的节点增加一个域Count用于统计左孩子节点的总数
即:比当前节点更小的节点的数目
那么一个新的数字A[i],从根节点开始插入
如果大于某节点,那么其最终ans[i]+=count+1
即:累加上某节点以及该节点所有左孩子节点的总数
如果小于某节点,那么当前节点的count+=1
在插入的过程中即可完成ans[]数组的填充,需要注意左右孩子为NULL的情形。
struct treenode
{
int val;//当前节点值
int count;//当前节点左子树节点数目 用于计算比当前val小的节点的数目
treenode* left;
treenode* right;
treenode(int _v)
{
val=_v;
count=0;
left=NULL;
right=NULL;
}
};
class Rank {
public:
vector<int> getRankOfNumber(vector<int> A, int n) {
vector<int> ans(n,0);
treenode* root=new treenode(A[0]);
for(int i=1;i<n;i++) //从A[1]开始构建二叉搜索树
{
treenode* p=root;//从根节点开始搜索
while(p)
{
if(p->val==A[i]) //刚好等于当前值
break;
if(A[i]<p->val) //比当前节点更小 那么当前节点的count+1
{
p->count+=1;
if(p->left==NULL) //左边没有节点
{
p->left=new treenode(A[i]);
break;
}
else
p=p->left;
}
else //A[i]比当前节点更大 那么之前比A[i]小的值进行叠加
{
ans[i]+=1;//累加上当前节点
ans[i]+=p->count;//累加上比当前节点更小 (那么也比A[i]小)
if(p->right==NULL)
{
p->right=new treenode(A[i]);
break;
}
else
p=p->right;
}
}
}
return ans;
}
};
查看4道真题和解析