[LeetCode] 315

315. Count of Smaller Numbers After Self


题目:给定一个数列,返回vector<int> count, count[i] 代表 nums 中在nums[i] 之后且比nums[i] 小的数字的个数


思路:建立BST,每个节点除了左右child之外增加一个int l代表数组中比l小的数的数量。

从后往前遍历数组,把每个数字插入BST的时候统计比它小的数字的个数

如果root->val >= a, 那么插入左子树,root->l++

如果root->val < a, 那么插入右子树,ans += root->l

当数字被插入时返回ans的数字

struct Node
{
        Node* left;
        Node* right;
        int val;
        int l;
        Node(int x) : val(x), left(NULL), right(NULL), l(0) {}
};

    
void insert(Node* & root, int a , int & ans)
{
        if(root == NULL)
        {
                root = new Node(a);
                return;
        }
        if(root->val >= a)
        {
                root->l++;
                insert(root->left, a, ans);
        }
        else
        {
                ans +=  root->l+1;
                insert(root->right, a, ans);
        }
}

vector<int> countSmaller(vector<int> &nums)
{
        int n = nums.size();
        if(n == 0) return vector<int>();
        vector<int> result(nums.size(), 0);
        Node* root = new Node(nums[n-1]);
        for(int i = n-2; i >= 0; i--)
        {
                int ans = 0;
                insert(root, nums[i] , ans);
                result[i] = ans;
        }
        return result;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值