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 }

 

posted @ 2016-09-21 16:54  zslhq~  阅读(160)  评论(1编辑  收藏  举报