338. Counting Bits

来源:互联网 发布:淘宝主图视频内存大小 编辑:程序博客网 时间:2024/06/05 09:13

Problem

Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1’s in their binary representation and return them as an array.

Example:
For num = 5 you should return [0,1,1,2,1,2].

Solution

首先寻找结果的模式或者规则
index:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
num: 0 1 1 2 1 2 2 3 1 2 2 3 2 3 3 4

Obviously, this is overlap sub problem, and we can come up the DP solution. For now, we need find the function to implement DP.

dp[0] = 0;

dp[1] = dp[0] + 1;

dp[2] = dp[0] + 1;

dp[3] = dp[1] +1;

dp[4] = dp[0] + 1;

dp[5] = dp[1] + 1;

dp[6] = dp[2] + 1;

dp[7] = dp[3] + 1;

dp[8] = dp[0] + 1; …

This is the function we get, now we need find the other pattern for the function to get the general function. After we analyze the above function, we can get dp[0] = 0;

dp[1] = dp[1-1] + 1;

dp[2] = dp[2-2] + 1;

dp[3] = dp[3-2] +1;

dp[4] = dp[4-4] + 1;

dp[5] = dp[5-4] + 1;

dp[6] = dp[6-4] + 1;

dp[7] = dp[7-4] + 1;

dp[8] = dp[8-8] + 1; ..

class Solution {public:    vector<int> countBits(int num) {        vector<int> ret(num+1,0);        int offset = 1;        for(int i = 1;i<=num;++i)        {            if(2*offset == i)                offset *=2;            ret[i] = ret[i-offset]+1;        }        return ret;    }};

暴力法:

class Solution {public:    vector<int> countBits(int num) {        vector<int> ret;        for(int i = 0;i<=num;++i)        {            ret.push_back(countBitsInSingleNum(i));        }        return ret;    }    int countBitsInSingleNum(int n)    {        int count = 0;        while(n != 0)        {            if(n&1)                ++count;            n = n>>1;        }        return count;    }};
0 0
原创粉丝点击