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

题目描述

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值