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,记住子问题的解。

posted @ 2019-09-15 19:40  于老师的父亲王老爷子  阅读(9)  评论(0)    收藏  举报