题目
要求时间O(n),空间O(n)
思路
每个二进制数i分两种情况,
①最低位为0
若最低位为0,则dp[i] = dp[i >> 1];
②最低位为1
若最低位为1,则dp[i] = dp[i - 1] + 1;
代码
class Solution {
public:
vector<int> countBits(int num) {
//若最低位为0,则dp[i] = dp[i >> 1]; 若最低位为1,则dp[i] = dp[i - 1] + 1;
int lowBit = 0;
vector<int> dp(num + 1);
dp[0] = 0, dp[1] = 1;
for (int i = 2; i <= num; i++) {
lowBit = i & 0x00000001;
dp[i] = bit? (dp[i - 1] + 1) : dp[i>>1];
}
return dp;
}
};