題目來(lái)源
要求計(jì)算從1到n的所有二進(jìn)制數(shù)的1的個(gè)數(shù)。
我一開(kāi)始是這么做的,dp[10111] = dp[111] + 1
,就是去掉最高位之后的數(shù)的1的個(gè)數(shù)加1。
class Solution {
public:
int cal(int x)
{
int a = 1;
while (a <= x)
a = a * 2;
return x - a / 2;
}
vector<int> countBits(int num) {
vector<int> dp(num+1, 0);
dp[1] = 1;
for (int i=2; i<=num; i++) {
dp[i] = dp[cal(i)] + 1;
}
return dp;
}
};
然后把vector<int>dp改為static,快了一些,代碼如下:
class Solution {
public:
int cal(int x)
{
int a = 1;
while (a <= x)
a = a * 2;
return x - a / 2;
}
vector<int> countBits(int num) {
static vector<int> dp;
if (dp.size() == 0)
dp.push_back(0);
for (int i=dp.size(); i<=num; i++) {
dp.push_back(dp[cal(i)] + 1);
}
return vector<int>(dp.begin(), dp.begin()+num+1);
}
};
然后我發(fā)現(xiàn)我有點(diǎn)傻啊,不懂得變通啊,明明去掉最高位的1和最低位的1都一樣的呀!!!
代碼如下:
class Solution {
public:
vector<int> countBits(int num) {
static vector<int> dp;
if (dp.size() == 0)
dp.push_back(0);
for (int i=dp.size(); i<=num; i++) {
dp.push_back(dp[i & (i-1)] + 1);
}
return vector<int>(dp.begin(), dp.begin()+num+1);
}
};
或者這樣子:
class Solution {
public:
vector<int> countBits(int num) {
vector<int> dp(num+1, 0);
for (int i=1; i<=num; i++) {
dp[i] = dp[i & (i-1)] + 1;
}
return dp;
}
};