leetCode 338. Counting Bits | Dynamic Programming | Medium

338. Counting Bits


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].

题目大意:

给一个数字,比如5,那么5之前所有的整数的每个二进制表示中1的个数。

思路:

数字二进制表示二进制中1的个数
000
1
11
2
101
3112
41001
51012
61102
71113
810001
910012
1010102
1110113
1211002
1311013
1411103
1511114
16100001
根据上面分析的到一个规律:每达到2的i次方,就会从第一个元素开始依次加1,赋值给当前元素到下一次达到2的i+1次方的元素。


代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class  Solution {
public :
     vector< int > countBits( int  num) {
         vector< int > result;
         if (num == 0)
         {
             result.push_back(0);
             return  result;
         }
         if (num == 1)
         {
             result.push_back(0);
             result.push_back(1);
             return  result;
         }
         result.push_back(0);
         result.push_back(1);
         
         int  temp = 2;
         for ( int  i = 2; i <=num ; i++)
         {
             if (i == temp*2)
                 temp *= 2;
             result.push_back(result[i-temp] + 1);
         }
         return  result;
     }
};


本文转自313119992 51CTO博客,原文链接:http://blog.51cto.com/qiaopeng688/1845319


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值