比特位计数

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/counting-bits

给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。

示例 1:

输入: 2
输出: [0,1,1]

示例 2:

输入: 5
输出: [0,1,1,2,1,2]

进阶:

  • 给出时间复杂度为O(n*sizeof(integer))的解答非常容易。但你可以在线性时间O(n)内用一趟扫描做到吗?
  • 要求算法的空间复杂度为O(n)。
  • 你能进一步完善解法吗?要求在C++或任何其他语言中不使用任何内置函数(如 C++ 中的 __builtin_popcount)来执行此操作。

暴力解法:

class Solution {
    public int[] countBits(int num) {
        int[] ans = new int[num+1];
        for(int i=0;i<=num;i++){
            ans[i] = getZeroCount(i);
        }
        return ans;
    }

    private int getZeroCount(int num){
        int count = 0;
        while(num != 0){
            int tmp = num&1;
            if(tmp == 1){
                count++;
            }
            num = num>>1;
        }
        return count;
    }
}

动态规划解法:

class Solution {
    public int[] countBits(int num) {
        if(num < 1)
            return new int[]{0};
        int[] dp = new int[num+1];
        dp[0] = 0;
        dp[1] = 1;
        for(int i=2;i<=num;i++){
            //最后一位是否是1
            int last = i&1;
            dp[i] = last + dp[i>>1];
        }
        return dp;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将...
    间歇性发呆阅读 708评论 0 0
  • 难度中等题目描述: 给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数...
    hqwer阅读 806评论 0 0
  • 题目链接:[Leetcode]338.比特位计数 题干 给定一个非负整数 num。对于 0 ≤ i ≤ num 范...
    闭门造折阅读 1,014评论 0 0
  • 给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将...
    Houtasu阅读 3,895评论 0 0
  • 给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将...
    佛祖拿屠刀阅读 1,391评论 0 0