当前位置:   article > 正文

树状数组(右侧小于当前元素个数)_计算右侧小于当前元素的个数 树状数组

计算右侧小于当前元素的个数 树状数组

参考官方题解学习了树状数组

适用场景:频繁更新数组、查询前缀和(nlogn)

lowBit:计算最低位的1。原码取反后原来的1变为0,0变为1,+1后连续进位,当前最低位的1的位置即为原来的最低位的1。

tree[i]管辖范围:

i为奇数:原数组中nums[i]

i为2^k:0~i前缀和

i为其他偶数:2^(k-1)+1~i

query:查询前缀和

update:逐个更新管辖范围内tree[i]

稀疏数组离散化处理: 排序后求出每个元素的相对大小进行存储 

  1. class bitTree{
  2. private:
  3. vector<int> tree;
  4. int treeSize;
  5. public:
  6. bitTree(int s):treeSize(s),tree(s){}//
  7. int lowBit(int i){return i&(-i);}
  8. int query(int i){
  9. int sum=0;
  10. while(i){
  11. sum+=tree[i];
  12. i-=lowBit(i);
  13. }
  14. return sum;
  15. }
  16. void update(int i){
  17. while(i<treeSize){
  18. tree[i]++;
  19. i+=lowBit(i);
  20. }
  21. }
  22. };
  23. class Solution {
  24. public:
  25. vector<int> countSmaller(vector<int>& nums) {
  26. int numSize=nums.size();
  27. vector<int> c=nums,ret(numSize);
  28. sort(c.begin(),c.end());
  29. bitTree t(lower_bound(c.begin(),c.end(),c.back())-c.begin()+2);
  30. for(int i=numSize-1;i>=0;i--){
  31. nums[i]=lower_bound(c.begin(),c.end(),nums[i])-c.begin()+1;
  32. t.update(nums[i]);
  33. ret[i]=t.query(nums[i]-1);
  34. }
  35. return ret;
  36. }
  37. };

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号