前 n 个数字二进制中 1 的个数

题干

给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。
示例:

输入: n = 2
输出: [0,1,1]
解释:
0 --> 0
1 --> 1
2 --> 10

思路

从单纯的暴力出发,统计每个数字中1的个数。
进一步优化,借助动态规划,借助上一个数字计算当前数字中1的个数

动态规划方程
i为奇数 dp[i] = dp[i-1]+1
i为偶数 dp[i] = dp[i/2]

实现

class Solution {
    public int[] countBits(int n) {
        int[] dp = new int[n+1];
        for(int i=1; i<n+1; i++){
            if(i%2==0){
                dp[i] = dp[i>>1];
            }
            else{
                dp[i] = dp[i-1]+1;
            }
        }
        return dp;
    }
}
posted @ 2022-01-28 22:59  Star_Rising  阅读(83)  评论(0)    收藏  举报