【每日一题-leetcode】338. 比特位计数

28 篇文章 0 订阅
10 篇文章 0 订阅

338. 比特位计数

  1. 比特位计数

难度中等349

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

示例 1:

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

示例 2:

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

1.位运算

// 问题分析 主要是计算出每个位数Num是否为1 并且当前的1的个数
        //而本题的思路 显然不是按照这样做。而是把num分隔成多个数字来看当前的位数1的个数。
        //比如 5 依次求出 1 2 3 4 5 添加到数组中,
        // 时间复杂度 O(n*k) 空间复杂度O(n)
        public int[] countBits(int num) {
            int [] ans = new int [num+1];
            
            for(int i=0;i<=num;i++){
                ans[i] = popCount(i);
            }
            return ans;
        }
    
        //x = 0  count = 0 
        //x = 1 count = 1
        //x = 2 count = 1
        public int popCount(int x){
            int count = 0;
            for(;x!=0;count++){
                x&= x-1;
            }
            return count;
        }

2.dp

// dp[0] = 0
        // dp[1] = 1
        // dp[2] = 1
        // dp[3] = 2
        // dp[4] = 1
        // dp[5] = 2
        // 思路:dp
        // 动态规划 我们需要考虑基础条件 0 = 0 1 = 1 而一个数字是奇数和偶数
        // i%2 == 0 偶数 右移 i/2 等价于 右移1位 dp[i] = dp[i/2]的值
        // i%1 == 1 奇数 上一个数字加上1 dp[i] = dp[i-1] + 1
        // 时间复杂度为O(n) 空间复杂度为O(n)
        public int[] countBits(int num) {
            if(num==0) return new int[]{0};
            int[] dp = new int[num+1];
            dp[0] = 0;
            dp[1] = 1;
            for(int i=2; i<=num; i++){
                if(i%2==0) dp[i]=dp[i/2];
                else dp[i]=dp[i-1]+1;
            }
            return dp;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qxlxi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值