LeetCode:338. Counting Bits

能做出来,但是有巧妙的方法:
首先是自己的方法:
class Solution {
public:
vector<int> countBits(int num) {
if (num < 0)
return vector<int>();
vector<int> ret(num+1, 0);
int cnt = 1;
while (cnt <= num) {
ret[cnt] = 1;
cnt *= 2;
}
int lastIdx = 2;
for (int i = 3; i <= num; ++i) {
if (ret[i] == 1)
lastIdx = i;
else
ret[i] = ret[i-lastIdx] + 1;
}
return ret;
}
};
就是观察到:如果遇到一个位置i为2的幂,那么它之后的i-1个位置,就是前i-1个对应位置的个数加一。
然后是巧妙的方法:
class Solution {
public:
vector<int> countBits(int num) {
vector<int> ret(num+1, 0);
for (int i = 1; i <= num; ++i)
ret[i] = ret[i & (i-1)] + 1;
return ret;
}
};
i & (i-1)消掉最后一位,就用它再加上1。主要还是dp,记住子问题的解。
浙公网安备 33010602011771号