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:
For num = 5
you should return [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.
Show Hint
这道题其实是一道简单的动态规划的问题.一定不能把前面计算得出的结果给丢掉了...注释的部分是我自己写的代码,非注释的是别人的代码...嗯..两种代码的运行效率都不是太高.但还是讲一下思路.
在这里我们只需要注意一个进位的情况,当我们进位到了一个全新的位数,那么这个时候应该是1000000这样的形式,和0000000的区别仅仅在于我们多了一个1,所以100001就应该等于000001 +1.所以有以下代码.(注释部分)
public class Solution {
public int[] countBits(int num) {
int arr[] = new int[num+1];
arr[0] = 0;
for (int i = 1; i <= num; ++i) {
arr[i] = arr[i & i-1] + 1;
}
return arr;
/*
int[] result = new int[num+1];
result[0] = 0;
int div = 2;
for(int i=1;i<=num;i++)
{
if(i % div == 0)
{
div*=2;
result[i] = 1;
}
else
{
result[i] = 1+ result[i - div/2];
}
}
return result;
*/
}
}