338. 比特位计数
题目
给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。
示例
输入:n = 5
输出:[0,1,1,2,1,2]
解释:
0 --> 0
1 --> 1
2 --> 10
3 --> 11
4 --> 100
5 --> 101
我的代码
思路:动态规划
每个数的二进制可以看作最高位的一个1加上后几位。
例如:9=8+1
1001=1000+1
cnt[9] = 1 + cnt[ 9-8 ]
/**
0 0
1 1
10 1
11 2
100 1
101 2
110 2
111 3
1000 1
1001 2
1010 2
1011 3
1100 2
1101 3
1110 3
1111 4
*/
class Solution {
public:
vector<int> countBits(int n) {
vector<int> v;
v.push_back(0);
int t=1; //t代表2的幂
for(int i=1;i<=n;i++){
if(i==t){
v.push_back(1);
t*=2;
}else{
v.push_back(1+v[i-t/2]);
}
}
return v;
}
};