一、DP:
状态转移方程(我也不知道是怎么得出来的):
ans[i] = ans[i/2]+i%2;
tql
引用博客:
二、或者调用函数
__builtin_popcount(n)
三、上面的算法有点慢,下面引用一个较为高效的DP
思路:
对于一个偶数 n ;其二进制组成最低位为0,所以其1的位数就是除了最低位之外前面那一部分中1的位数,即是i/2中1的位数。 对于一个奇数n,其末位的数一定是1,那么对于n-1,一定是个偶数,并且只需要将n-1的末位0改成1就可以变成 n,因为 a[n] = a[n - 1] +1; 则可以得出上面两个递推关系式。
按照动态规划的思路:
1:问题归纳:用数组a[ i ] 表示 i 的二进制中1的个数。
2:递推关系式 a[n] = a[n/2] n为偶数
a[n] = a[n-1] +1 n为奇数
3:初始化:a[0] = 0
代码:
class Solution {
public:
vector<int> countBits(int num) {
vector<int> res(num+1,0);
for(int i=1;i<=num;i++)
{
if(i%2==1) res[i]=res[i-1]+1;
else
res[i]=res[i/2];
}
return res;
}
};
思路想得好,程序时间少