剑指 Offer II 003. 前 n 个数字二进制中 1 的个数
思路:本题求某一个数当中1的个数并不难,而n个数直接求,答案并无明显规律,直接暴力查找很明显不可取。
所以本题使用的是动态规划:观察以下数字
0 1
10 11
100 101 110 111
1000 1001 1010 1011 1100 1101 1110 1111
不难发现去掉前面的1以后每一个数字都在之前出现过,(100的前一个是0)所以本题公式就是:
bit[i] = bit[i - highbit] + 1;
class Solution {
public:
vector<int> countBits(int n) {
int highbit = 0;
vector<int> bit(n + 1);
for(int i = 1;i <= n;i++)
{
if((i & (i - 1)) == 0)
//当进入n为100、1000类的数字时,表明进入下一阶段,更新最高位大小
{
highbit = i;
}
bit[i] = bit[i - highbit] + 1;
}
return bit;
}
};