当前位置: 代码迷 >> 综合 >> 154.(338)比特位计数
  详细解决方案

154.(338)比特位计数

热度:23   发布时间:2024-02-08 01:11:47.0

题目描述:

给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。

示例 1:

输入: 2
输出: [0,1,1]
示例 2:

输入: 5
输出: [0,1,1,2,1,2]
进阶:

给出时间复杂度为O(n*sizeof(integer))的解答非常容易。但你可以在线性时间O(n)内用一趟扫描做到吗?
要求算法的空间复杂度为O(n)。
你能进一步完善解法吗?要求在C++或任何其他语言中不使用任何内置函数(如 C++ 中的 __builtin_popcount)来执行此操作。

思路:

想想十进制转换成二进制的数学换算

代码:

class Solution {
public:vector<int> countBits(int num) {vector<int> res(num+1,0);for(int i = 0;i<=num;i++)if(i%2==1)res[i]=res[i/2]+1;else res[i]=res[i/2];return res;}
};

执行效率:

执行用时:8 ms, 在所有 C++ 提交中击败了70.56%的用户

内存消耗:8 MB, 在所有 C++ 提交中击败了50.47%的用户

  相关解决方案