本文主要是介绍[LeetCode] 338. Counting Bits,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题:https://leetcode.com/problems/counting-bits/description/
题目
Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1’s in their binary representation and return them as an array.
Example 1:
Input: 2
Output: [0,1,1]
Example 2:
Input: 5
Output: [0,1,1,2,1,2]
Follow up:
It is very easy to come up with a solution with run time O(n*sizeof(integer)). But can you do it in linear time O(n) /possibly in a single pass?
Space complexity should be O(n).
Can you do it like a boss? Do it without using any builtin function like __builtin_popcount in c++ or in any other language.
思路
由于 时间复杂度的要求是 O(n) 所以不能对每个数计算相应的 二进制中 ‘1’ 的个数。
故,需要往 递推的思路 靠。
我们可以发现 对于 一个数 i ,其 最后一位为 i%2 ,前面的 位 与 i>>1相同。计算 每个i可以根据前面 i>>1 的结果。
得到计算 i 的 二进制位中 ‘1’ 的个数为:vec[i] = vec[i>>1] + i%2
vec[0] = 0
i ->(1~num)
eg:
0
1
10
11
100
101
110
111
1000
ps:其中 >>1 操作与 //2 操作等价,但 >>1 更快。
Code
python
class Solution:def countBits(self, num):""":type num: int:rtype: List[int]"""vec = [0]*(num+1)for i in range(1,num+1):vec[i] = vec[i>>1] + i % 2return vec
Java
class Solution {public int[] countBits(int num) {int [] vec = new int[num+1];vec[0] = 0;for(int i =1 ; i <= num;i++)vec[i] = vec[i>>1] + i %2;return vec;}
}
这篇关于[LeetCode] 338. Counting Bits的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!