https://leetcode-cn.com/problems/counting-bits/
思路一:一个数可以通过2的幂次的和来表示出来,那么假设当前增加的数为
a
d
d
add
add,通过枚举所有大于
a
d
d
add
add且小于等于
n
u
m
num
num的2的幂次就可以递推出新的数。
class Solution {
public:
vector<int> countBits(int num) {
vector<int> ans(num+1);
int cur=1,add=0;
while(cur+add<=num)
{
if(add==cur)
cur<<=1;
int tmpcur=cur;
while(tmpcur+add<=num)
{
if(add)
ans[tmpcur+add]=ans[tmpcur]+ans[add];
else
ans[tmpcur]=1;
tmpcur<<=1;
}
++add;
}
return ans;
}
};
思路二:递推(dp)。
class Solution {
public:
vector<int> countBits(int num) {
vector<int> ans(num+1);
for(int i=1;i<=num;i++)
ans[i]=ans[i>>1]+(i&1);
return ans;
}
};