二进制中1的个数

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

解法一:两重循环直接计算

  1. public int[] countBits(int num) {
  2. int[] ans = new int[num+1];
  3. if(num == 0) ans[0] = 0;
  4. for(int i = 1; i <= num; i++){
  5. int size = 0;
  6. int temp = i;
  7. while(temp > 0){
  8. if(temp%2 == 1){
  9. size++;
  10. }
  11. temp /= 2;
  12. }
  13. ans[i] = size;
  14. }
  15. return ans;
  16. }
  • 时间复杂度:O(k*num);

  • 空间复杂度:O(1),除了返回的数组以外,空间复杂度为常数。

解法二:动态规划,最低有效位

public int[] countBits(int num) {
    int[] bits = new int[num+1];

    for(int i = 1; i <= num; i++){
        bits[i] = bits[i >> 1] + (i&1);
    }

    return bits;
}