LeetCode 338 Counting Bits(位运算)

来源:互联网 发布:bluestacks mac 热 编辑:程序博客网 时间:2024/04/29 18:05

题意:用O(n)的复杂度求出[0, n]内所有数的1的数量。

思路:假设每个数的二进制表示中有num[i]个1,现在有一个数k,k-1二进制表示中最右有p个连续的1,现在将k-1加一,那么这连续的p个1会变成0,而且第p+1位会变成1,也就是说我们得到了一个递推式,num[i] = num[i-1] + 1 - p。

现在的问题就是求p,可以用unordered_map存储一个映射,二进制表示为p个连续的1数的十进制映射到p,这个预处理一下即可。

class Solution {public:    vector<int> countBits(int num) {        unordered_map<int, int> um;        vector<int> ans;        for (int i = 1, j = 0; i < (1<<30); i<<=1)            um[i-1] = j++;        ans.push_back(0);        for (int i = 1; i <= num; i++) {            int ones = (i^(i-1)) >> 1;            ans.push_back(ans[i-1]+1-um[ones]);        }        return ans;    }};

1 0