LeetCode

338. 比特位计数 (动态规划)

2021-03-08  本文已影响0人  闭门造折

力扣题解《卑鄙的异乡人,巧妙的动态规划(图解过程))》

方法一:暴力计算

思路

复杂度分析

快乐小视频




具体代码

class Solution {
public:
    // 搞一个新的函数,来将10进制转换成2进制数。
    int trans2bit(int num){
        int ans = 0;
        // 直到num全部转换完成,才退出循环
        while(num > 0){
            // 判断当前位是0还是1
            // 无论是0还是1都添加到答案中
            ans += num % 2;
            // 不断除以2,计算下一位
            num /= 2;
        }
        // 返回二进制表示时,1的个数
        return ans;
    }
    vector<int> countBits(int num) {
        vector<int> ans(num + 1);
        // 0的结果就是0,因此从1开始循环
        for(int i = 1; i <= num; i++){
            ans[i] = trans2bit(i);
        }
        return ans;
    }
};

方法二:简单的动态规划

思路

复杂度分析

快乐小视频



具体代码

class Solution {
public:
    vector<int> countBits(int num) {
        // 预先开好空间
        vector<int> dp(num + 1);

        // 同样不需要从0开始,因为dp[0] = 0
        for(int i = 1; i <= num; i++){
            if(i % 2 == 0){ // 偶数
                dp[i] = dp[i / 2];
            }
            else{ // 奇数
                dp[i] = dp[(i - 1) / 2] + 1;
            }
        }
        
        // dp数组即为所求
        return dp;
    }
};

方法三:卑鄙的异乡人,巧妙的动态规划

思路

复杂度分析

快乐小视频




具体代码

class Solution {
public:
    // 搞一个新的函数,计算数字num二进制表示有几个1。
    int trans2bit(int num){
        int ans = 0;
        // 直到num位0,才退出循环
        while(num > 0){
            // num不为零,说明至少还有一个1
            ans++;
            // 删去num最右侧的1
            num &= num - 1;
        }
        // 返回二进制表示时,1的个数
        return ans;
    }
    vector<int> countBits(int num) {
        vector<int> ans(num + 1);
        // 0的结果就是0,因此从1开始循环
        for(int i = 1; i <= num; i++){
            ans[i] = trans2bit(i);
        }
        return ans;
    }
};
class Solution {
public:
    vector<int> countBits(int num) {
        // 预先开好空间
        vector<int> dp(num + 1);

        // 同样不需要从0开始,因为dp[0] = 0
        for(int i = 1; i <= num; i++){
            // 转移方程:
            dp[i] = dp[i & (i - 1)] + 1;
        }
        
        // dp数组即为所求
        return dp;
    }
};
上一篇下一篇

猜你喜欢

热点阅读