[LeetCode] 315

315. Count of Smaller Numbers After Self


题目:给定一个数列,返回vector 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 countSmaller(vector &nums)
{
        int n = nums.size();
        if(n == 0) return vector();
        vector 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;
}


你可能感兴趣的:(leetcode,c++)