题解 | #维护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;

    }
};
全部评论
老哥你这刷题量可以呀😂
点赞 回复 分享
发布于 2022-01-18 11:50

相关推荐

努力学习的小绵羊:我反倒觉得这种挺好的,给不到我想要的就别浪费大家时间了
点赞 评论 收藏
分享
11-15 19:28
已编辑
蚌埠坦克学院 硬件开发
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务