题意
给一个数num,求出0到num之间所有数的二进制表示中1的个数。
思路
首先,有这样一个事实:i & (i - 1)
表示:将i的二进制表示中最低的那一位1置为0后的二进制表示。例如:9的二进制表示:1001,那么,9 & (9-1) = 1001 & 1000 = 1000
。即i中1的个数比i & (i - 1)
多1位。
状态表示:
d[i]
,数i的二进制表示中1的个数。
转移方程:
d[i]=d[i&(i−1)]+1
代码
class Solution {
public:
vector<int> countBits(int num) {
vector<int> d(num + 1, 0);
for (int i = 1; i <= num; i++) d[i] = d[i & (i - 1)] + 1;
return d;
}
};