原题
思路
- 动态规划、位运算
- 观察二进制数就可以知道,除了0的二进制数首位为0,其他二进制数首位都为1。所以bits[i] = bits[i<<1] +1;但后来在实现动态规划的时候发现i<<1还没有生成,所以只能通过bits[i] = bits[i>>1] + i&1来算。例如bits[110] = bits[11] + (110&001);后面的部分是为了获得最后一位是0还是1
代码
class Solution {
public:
vector<int> countBits(int n) {
vector<int> bits(n+1);
bits[0] = 0;
for (int i = 1; i <= n; i++) bits[i] = bits[i>>1] + (i & 1);
return bits;
}
};
运行截图

收获
- 110>>1 = 11; 11<<1 = 110
- 位运算是个奇妙的东西!
文章介绍了LeetCode第338题的解决方案,通过动态规划和位运算来计算每个整数的比特位1的个数。关键在于利用位移操作更新bits数组,例如bits[i]=bits[i>>1]+(i&1)。作者强调了位运算的巧妙运用,并分享了运行截图作为验证。
235

被折叠的 条评论
为什么被折叠?



