给定一个非负整数num。对于每一个数字我在范围0≤I≤NUM计算1名在其二进制表示的数量,并返回它们作为一个数组。
范例1:
输入:2
输出:[0,1,1]
范例2:
输入:5
输出:[0,1,1,2,1,2]
跟进:
提出运行时间为O(n * sizeof(integer))的解决方案非常容易。但是,您能否在线性时间O(n)中 /可能在一次通过中完成?
空间复杂度应为O(n)。
你能像老板一样吗?无需使用c ++或任何其他语言的任何内置函数(如__builtin_popcount)即可完成此操作。
思路:
可以利用动态规划,dp[n]=dp[n&(n-1) ]+1
这是因为n会比 n&(n-1) 少了一个1.
code
class Solution {
//题目意思是,从0到num的每一个数的1的个数是多少,那么vector的第i位的值就是多少。
public:
vector<int> countBits(int num) {
vector<int> ret(num+1);
for(int i=1;i<=num; ++i)
{
ret[i]=ret[i & (i-1)]+1; //因为 i&(i-1) 得出来的结果会比i 的二进制少一个1. 这是动态规划
}
return ret;
}
};
//正常计算的话,就是每个数字计算一遍32位,随着字节数的增加位数变多