【每日一题】JavaScript之leetcode刷题 338. 比特位计数-简单动态规划

134 阅读1分钟

338. 比特位计数

这是leetcode中338. 比特位计数难度为简单

题目描述


给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。

示例 1:

输入:n = 2

输出:[0,1,1]

解释:

0 --> 0

1 --> 1

2 --> 10

示例 2:

输入:n = 5

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

解释:

0 --> 0

1 --> 1

2 --> 10

3 --> 11

4 --> 100

5 --> 101

提示:

0 <= n <= 105

来源:力扣(LeetCode)

链接:leetcode-cn.com/problems/co…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

算法描述


/**
 * @param {number} n
 * @return {number[]}
 */
var countBits = function(n) {
    //就是算出从0到n中,每个n转化成二进制后的1的个数是多少, 18点39分
    //首先先把每个数i转化程二进制,然后在进行遍历
    // var res = new Array(n+1)
    // res.fill(0)
    // for(let i = 0;i <= n;i++){
    //     //转化成二进制
    //     let num = i.toString(2) 
    //     for(let j = 0;j < num.length;j++){
    //         //如果等于1,就让对应的数组加上一
    //         if(num[j] == 1){
    //             res[i]++
    //         }
    //     }
    // }
    // return res  //18点42分 不过如果是这样子的话,效率好低
    //19点00分
    //看了一会题解,发现官方使用了动态规划感觉挺厉害的
    var res = new Array(n+1).fill(0)
    for(let i = 1;i <= n; i++){
        res[i] = res[i >> 1] + (i & 1) //等于左移以为对应数字以及末位数
    }
    //例如:   101 = 10对应的1的个数 + 末位是否为1
    return res
    //效率瞬间提高 
};

复杂度分析

时间复杂度:O(n),每个数字进行一次,循环后为n

空间复杂度:O(1);数组

最后


这是我2022年分享的「leetcode」第NO.5篇文章。