前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数

LeetCode 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数

原创
作者头像
freesan44
修改2021-09-18 14:55:43
3120
修改2021-09-18 14:55:43
举报
文章被收录于专栏:freesan44

题目地址 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数)

https://leetcode-cn.com/problems/w3tCBm/

题目描述

代码语言:txt
复制
给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组。



 



示例 1:



输入: n = 2

输出: [0,1,1]

解释: 

0 --> 0

1 --> 1

2 --> 10





示例 2:



输入: n = 5

输出: [0,1,1,2,1,2]

解释:

0 --> 0

1 --> 1

2 --> 10

3 --> 11

4 --> 100

5 --> 101





 



说明 :



0 <= n <= 105



 



进阶:



给出时间复杂度为 O(n\*sizeof(integer)) 的解答非常容易。但你可以在线性时间 O(n) 内用一趟扫描做到吗?

要求算法的空间复杂度为 O(n) 。

你能进一步完善解法吗?要求在C++或任何其他语言中不使用任何内置函数(如 C++ 中的 \_\_builtin\_popcount )来执行此操作。



 



注意:本题与主站 338 题相同:https://leetcode-cn.com/problems/counting-bits/

思路

如果i为偶数,那么是上一位i-1的1数+1

如果i为奇数,那么是i/2的1数

代码

  • 语言支持:Python3

Python3 Code:

代码语言:txt
复制
class Solution:

    def countBits(self, n: int) -> List[int]:

        ## 暴力法

        # resList = []

        # for i in range(n+1):

        #     res = 0

        #     while i >=1:

        #         res += 1 if (i% 2 == 1) else 0

        #         i //= 2

        #     resList.append(res)

        # return resList

        # 如果i为偶数,那么是上一位i-1的1数+1

        # 如果i为奇数,那么是i/2的1数

        resList = []

        for i in range(n+1):

            res = None

            if i == 0:

                res = 0

            elif i == 1:

                res = 1

            elif i %2 == 0:#偶数

                res = resList[i//2]

            else:#奇数

                res = resList[i-1]+1

            resList.append(res)

        return resList

**复杂度分析**

令 n 为数组长度。

  • 时间复杂度:$O(n)$
  • 空间复杂度:$O(n)$

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目地址 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数)
  • 题目描述
  • 思路
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档