LeetCode#338 Counting Bits题解(C++版)

来源:互联网 发布:2004美国vs阿根廷数据 编辑:程序博客网 时间:2024/06/06 20:45

题干

这里写图片描述

原题网址:
https://leetcode.com/problems/counting-bits/description/

题干解析

给你一个非负整数num,要你返回一个向量,这个向量的数据代表在[0, num]中每个数的二进制写法中“1”的个数。

知识点

逻辑

难度

中等

解题思路

这道题用暴力解法可以说是非常简单的了,但是题干要求,不能用暴力解法,要让时间复杂度和空间复杂度都是O(n),这就需要想一种更为高效的算法。其实我的解法有点像“找规律”,通过列出0-16的二进制数的“1”的个数{0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4},我们可以发现以下规律:其实大于等于2的k次方、小于2的k+1次方之间的二进制数的“1”的个数,正好是大于等于0、小于2的k次方的数每个数对应加一得来,比如:当k等于1时,2的k次方等于2,2的k+1次方等于4,那么[2, 4)中(即2和3)的二进制数的“1”的个数是{1,2},[0, 2)中(即0和1)的二进制数的“1”的个数是{0,1},也就是{0,1}的中的两项各加1即可得{1,2}。发现这个规律之后我们就可以愉快地在时间复杂度和空间复杂度为O(n)的限制下得到我们要的解了。

代码

class Solution {public:    vector<int> countBits(int num) {        vector<int> ans;        int index = 0;        for (int i = 0; i <= num; i++) {            if (i == 0) {                ans.push_back(0);                continue;            }            if (i == pow(2, index)) {                index++;            }            ans.push_back(1 + ans[i - pow(2, index - 1)]);        }        return ans;    }};