315. Count of Smaller Numbers After Self BST

216 篇文章 0 订阅

You are given an integer array nums and you have to return a new counts array.The counts array has the property where counts[i] is the number of smaller elements to the right of nums[i].

Example:

Given nums = [5, 2, 6, 1]

To the right of 5 there are 2 smaller elements (2 and 1).
To the right of 2 there is only 1 smaller element (1).
To the right of 6 there is 1 smaller element (1).
To the right of 1 there is 0 smaller element.

Return the array [2, 1, 1, 0].

Subscribe to see which companies asked this question

分析:
参考网上的做法,采用BST结构是最直观和简单的。每个节点包括,左子树,右子树,值,以及count,count标记右边比root->val小的值。
创建根节点,每插入一个数,与节点比较,记右边比当前节点小的个数为m,比节点大,向右走,m+=m+root->count+1;往左走则root->count++;表示比root节点小,在右边的节点多一个。
代码如下:
class BST{
    public:
        int val;
        int count;
        BST* left;
        BST*right;
        BST(int i,int c=0):val(i),count(c),left(NULL),right(NULL){}
        BST()=default;

};
void insert(BST*& root,int val, int& c )
      {
          if(root==NULL)
          {
              root=new BST(val);
              return ;
          }
          if((root->val)<val)
          {
              c+=root->count+1;
              insert(root->right,val,c);
          }
          else
          {
              root->count++;
              insert(root->left,val,c);
          }
      }
class Solution {
public:
    vector<int> countSmaller(vector<int>& nums) {
        unsigned len=nums.size();
        vector<int>result(len,0);
        if(len==0) return result;
        BST* root=new BST(nums[len-1],result[len-1]);
        for(int i=len-2;i>=0;--i)
        {
            insert(root,nums[i],result[i]);
        }
        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值