338. Counting Bits
不定期更新leetcode解题java答案。
采用pick one的方式选择题目。
题意为输入非负整数,返回一数组,数组的元素依次为0~N的二进制表示形式中1的个数。
0, 1, 10, 11, 100, 101。结果如下:
For num = 5
you should return [0,1,1,2,1,2]
.
易想到对单个数字右位移获得二进制形式1的数量,本题希望使用O(n)的时间复杂度来获得结果。
大体思路为,观察可发现[0~1]与[2~3]的区别只是首位多个1,[0,1]与[10,11],同理[0~3]与[4~8]一样,依次推导下去则可得到O(n)的算法,代码如下:
1 public class Solution { 2 public int[] countBits(int num) { 3 if(num == 0){ 4 int[] result = {0}; 5 return result; 6 } 7 if(num == 1){ 8 int[] result = {0, 1}; 9 return result; 10 } 11 12 int[] results = new int[num + 1]; 13 results[0] = 0; 14 results[1] = 1; 15 int tmp = 2; 16 for(int i = 2; i <= num; i++){ 17 if(i == tmp) 18 tmp *= 2; 19 20 results[i] = results[i - tmp / 2] + 1; 21 } 22 23 return results; 24 } 25 }
而从0~1也可以认为是首位多个1的形式,进一步改写得到结果如下:
1 public class Solution { 2 public int[] countBits(int num) { 3 int[] results = new int[num + 1]; 4 5 int tmp = 1; 6 for(int i = 1; i <= num; i++){ 7 if(i == tmp) 8 tmp *= 2; 9 10 results[i] = results[i - tmp / 2] + 1; 11 } 12 13 return results; 14 } 15 }