leetcode 338. 比特位计数

leetcode 338. 比特位计数

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

示例 1:

输入: 2

输出: [0,1,1]

示例2:

输入: 5

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

leetcode 338

思路

最高有效位
1 0001
2 0010
3 0011

4 0100

5 0101 = 4 + 1 = 0100 + 0001
6 0110 = 4 + 2 = 0100 + 0010
7 0111 = 4 + 3 = 0100 + 0011

代码

    def countBits(self, num: int) -> List[int]:
        dp = [0] * (num + 1)
        n = 1
        while n <= num:
            dp[n] = 1
            n <<= 1
        k = 0
        for i in range(1, num + 1):
            if dp[i] == 1:
                k = i
            else:
                dp[i] = dp[k] + dp[i-k]
        return dp

最低有效位
1 0001
2 0010 = (2 >> 1) = 1
3 0011 = 2 + 1
4 0100 = (4 >> 1) = 0010 = 2
5 0101 = 4 + 1
6 0110 = (6 >> 1) = 0011 = 3
7 0111 = 6 + 1
8 1000 = (8 >> 1) = 0100 = 4
9 1001 = 8 + 1
10 1010 = (10 >> 1) = 0101 = 5
11 1011 = 10 + 1

    def countBits(self, num: int) -> List[int]:
        dp = [0] * (num + 1)
        for i in range(1, num + 1):
            if i & 1:
                dp[i] = dp[i - 1] + 1
            else:
                dp[i] = dp[i >> 1]
        return dp

补充:获取二进制1的个数

    def popcount(self, num: int) -> int:
        count = 0
        while num:
            num &= (num - 1)
            count += 1
        return count

你可能感兴趣的:(leetcode,leetcode,算法,python,数据结构)