动态规划——338. Counting Bits[Medium]

来源:互联网 发布:钢结构图纸设计软件 编辑:程序博客网 时间:2024/05/21 08:59

题目描述

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

返回在0~num之间的数字的二进制‘1’的个数


解题思路

一般的思路,为每一个数求出二进制,是‘1’则对应的计数器加一。但是我估计应该会超时。由于刚学过动态规划,我就想能不能往那边靠。动态规划的思想就是,把大问题变成小问题,而这个小问题你在前面已经解决而且被记录下了结果(一般是一个数组)。加上,一说到二进制,自然会想到不断地模2。于是,开始找规律,找到大数和小数二进制的关系。(关系如下图)




代码如下


class Solution {public:    vector<int> countBits(int num) {        if (num == 0)return vector<int>(1, 0);vector<int> re(num+1, 0);re[1] = 1;for (int i = 1; i <= num; i++) {int tmp = i;int count = 0;while (re[tmp] == 0) {if (tmp == 0)break;tmp % 2 == 0 ? count + 0 : count++;tmp /= 2;}re[i] = re[tmp] + count;}return re;    }};


0 0
原创粉丝点击