剑指 Offer II 003. 前 n 个数字二进制中 1 的个数

递推就好了

所有2的次方均只有1个1

以每个2的次方为一段

遍历i从2到n

temp为当前不大于i的最大的2的次方

ret[i] = ret[temp] + ret[i - temp]

class Solution {
public:
    vector<int> countBits(int n) {
        int vis[100010];
        memset(vis, 0, sizeof(vis));
        int cr = 1;
        for(int i = 1; cr * 2 < 100000; i++)
        {
            cr = cr * 2;
            vis[cr] = 1;
        }
        int temp = 0;
        vector<int> ret;
        ret.push_back(0);
        if(n > 0)
            ret.push_back(1);
        for(int i = 2; i <= n; i++)
        {
            if(vis[i]) ret.push_back(1), temp = i;
            else ret.push_back(ret[temp] + ret[i - temp]);
        }
        return ret;
    }
};

 

posted @ 2022-03-27 23:56  WTSRUVF  阅读(23)  评论(0编辑  收藏  举报