AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

LeetCode 338. Counting Bits    原题链接    中等

作者: 作者的头像   yxc ,  2018-06-28 21:21:13 ,  所有人可见 ,  阅读 2060


8


2

题目描述

给定一个非负整数 $num$,对于所有的 $i$,$0 \le i \le num$,计算出 $i$ 的二进制表示中1的个数。

进一步:

  • 计算量是 $O(nlogn)$ 的算法很简单,你能否想出计算量是 $O(n)$ 的算法?
  • 空间复杂度只能是 $O(n)$;
  • 不可以使用C++中的__builtin_popcount等内建函数;

样例

输入:5
输出:[0,1,1,2,1,2]。

算法

(动态规划) $O(n)$

令f[i]表示 $i$ 的二进制表示中1的个数。
则f[i]可以由f[i/2]转移过来,$i$ 的二进制表示和 $\lfloor i/2 \rfloor$ 的二进制表示除了最后一位都一样,所以f[i] = f[i/2] + (i&1);

时间复杂度分析:总共有 $n$ 个状态,每个状态进行转移的计算量是 $O(1)$,所以总时间复杂度是 $O(n)$。

C++ 代码

class Solution {
public:
    vector<int> countBits(int num) {
        vector<int> f(num + 1, 0);
        for (int i = 1; i <= num; i ++ )
            f[i] = f[i >> 1] + (i & 1);
        return f;
    }
};

11 评论


用户头像
此账号已注消   2021-08-09 17:23         踩      回复
class Solution {
public:
    int lowbit(int x)
    {
        return x & -x ;
    }
    vector<int> countBits(int n) {
        vector<int> f(n + 1) ;
        for(int i = 1 ; i <= n ; i ++ )
        if(i == 1) f[i] = 1 ;
        else f[i] = f[i - lowbit(i)] + 1 ;
        return f ; 
    }
};

因为这个数是由前面的数得来的,所以用lowbit来获取前面的数也是可以的

用户头像
此账号已注消   2021-08-09 17:24         踩      回复

这个也可以AC的
不知道lowbit的计算需要多长的时间复杂度,有没有大佬给我说一下谢谢


用户头像
GRID   2021-03-03 22:40         踩      回复

%%%


用户头像
lightwing   2021-03-03 10:48         踩      回复

请问为啥 (i & 1)这里一定要加括号呢?


用户头像
wzc1995   2019-10-04 04:05         踩      回复

f[i] = f[i & (i - 1)] + 1 也是可以滴

用户头像
yxc   2019-10-06 18:47         踩      回复

有道理呀,很棒!

用户头像
虞世南   2020-02-20 14:10    回复了 yxc 的评论         踩      回复

诸神,请收下我的膝盖。

用户头像
yxc   2020-02-27 01:12    回复了 虞世南 的评论         踩      回复

谦虚了23333

用户头像
FF_1   2022-12-04 17:44         踩      回复

求教一下为什么呢,不是很理解,谢谢


用户头像
jzcheng   2018-08-31 03:16         踩      回复

当 i = 1 时, f[1] = f[0] + 1; 那f[0] 是从哪里来的呢

用户头像
yxc   2018-08-31 07:12         踩      回复

vector<int> f(num + 1, 0)这条语句会将所有f[i]初始化成0,包括f[0]。


App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息