赞
踩
题目描述
给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。
示例:
输入:nums = [5,2,6,1]
输出:[2,1,1,0]
解释:
5 的右侧有 2 个更小的元素 (2 和 1)
2 的右侧仅有 1 个更小的元素 (1)
6 的右侧有 1 个更小的元素 (1)
1 的右侧有 0 个更小的元素
树状数组视频链接
树状数组的作用:动态维护前缀和,前提是所有的数从1开始。树状数组tr[x] 保存的是以x为根节点的子树中叶节点的和。可以看下面的图,每一层末尾的零个数是相等的。tr[x]的长度为lowbit(x),还可以看出tr[x]的父节点是t[x+lowbit(x)],树的深度是log2n+1
基本操作lowbit(x):指的是非负整数n在二进制表示下最低位1以及后面0所构成的数字。例如:x = 10010,lowbit(x)=(10)2=2,lowbit(x)=x&(-x)
有两个操作:
class Solution { public: int n=20001; vector<int> tr; int lowbit(int x) { return x & -x; } void add(int x,int k) { for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=k; } int query(int x) { int res=0; for(int i=x;i;i-=lowbit(i)) res+=tr[i]; return res; } vector<int> countSmaller(vector<int>& nums) { tr.resize(n+1); vector<int> res(nums.size()); for(int i=nums.size()-1;i>=0;i--) { int x=nums[i]+10001; res[i]=query(x-1); add(x,1); } return res; } };
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。