Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

比特位计数 #121

Open
yankewei opened this issue Mar 3, 2021 · 1 comment
Open

比特位计数 #121

yankewei opened this issue Mar 3, 2021 · 1 comment
Labels
中等 题目难度为中等 位运算 题目包含位运算解法 动态规划 题目包含动态规划解法

Comments

@yankewei
Copy link
Owner

yankewei commented Mar 3, 2021

给定一个非负整数 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)来执行此操作。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/counting-bits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

@yankewei yankewei added 中等 题目难度为中等 位运算 题目包含位运算解法 动态规划 题目包含动态规划解法 labels Mar 3, 2021
@yankewei
Copy link
Owner Author

yankewei commented Mar 3, 2021

暴力

func countBits(num int) []int {
    bits := make([]int, num+1)
    for i := 0; i <= num; i++ {
        bits[i] = countBit(i)
    }
    return bits
}

func countBit(num int) int {
    var ret int
    for i := num; i > 0; i /= 2 {
        if i % 2 == 1 {
            ret++
        }
    }
    return ret
}

记忆化

func countBits(num int) []int {
    m := make([]int, num+1)
    bits := make([]int, num+1)
    for i := 0; i <= num; i++ {
        bits[i] = countBit(i, m)
        m[i] = bits[i]
    }
    return bits
}

func countBit(num int, m []int) int {
    var ret int
    for i := num; i > 0; i /= 2 {
        if m[i] != 0 {
            ret += m[i]
            break
        } else {
            if i % 2 == 1 {
                ret++
            }
        }
        
    }
    return ret
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
中等 题目难度为中等 位运算 题目包含位运算解法 动态规划 题目包含动态规划解法
Projects
None yet
Development

No branches or pull requests

1 participant