【LeetCode】338. 计算比特位的数目

2023-12-27 14:58

本文主要是介绍【LeetCode】338. 计算比特位的数目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题描述

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.

Follow up:

  • It is very easy to come up with a solution with run time O(n*sizeof(integer)). But can you do it in linear time O(n) /possibly in a single pass?
  • Space complexity should be O(n).
  • Can you do it like a boss? Do it without using any builtin function like __builtin_popcount in c++ or in any other language.

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

  • 用运行时O(n*sizeof(integer))提出一个解决方案是非常容易的。但你能在线性时间O(n)内完成吗?
  • 空间复杂度应该是O(n)。
  • 你能像老板那样做吗?在c++或其他任何语言中都不需要使用任何内建函数,如_builtin_popcount。
输入: 2
输出: [0,1,1]输入: 5
输出: [0,1,1,2,1,2]

 

Python 实现

实现一:转化成二进制数后数 ‘1’ 的个数。不用说,这是一个很耗内存的实现方法,每次转换成二进制数时都需要使用新的内存。

class Solution(object):def countBits(self, num):""":type num: int:rtype: List[int]"""bitCnt = [0]for n in range(1,num+1):bitCnt.append(format(n,'b').count('1'))return bitCnt

实现二:寻找规律。二进制数与 2 的 n 次方有很密切的关系,那么我们可以观察一下当入参 num 为 2 的 n 次方时,所得的结果有什么规律:

[0]
[0, 1]
[0, 1, 1, 2]
[0, 1, 1, 2, 1, 2, 2, 3]
[0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4]
...

没看出来?给个提示:看看每一个数组中,新增的后半部分元素与前半部分有什么关系。

没错,后半部分的每一个元素相当于前半部分每个元素加一后的结果。

但是这个方法存在一个缺点就是,当入参 num 较大时,一个极端情况 num = 2^n + 1,这样我们就需要计算到 2^(n+1),但后面的 2^n - 1 个数都会被抛弃,因此存在着运算资源的浪费。

class Solution(object):def countBits(self, num):""":type num: int:rtype: List[int]"""bitCnt = [0]while len(bitCnt) < num+1:bitCnt.extend([i+1 for i in bitCnt])return bitCnt[:num+1]

实现三:动态规划。

分析相邻两个整数在二进制表示下的关系。如果 n 是奇数,那么其最低比特位为1,则 n>>1 (表示 n 右移一位)出现 1 的个数再加 1 就是 n 出现 1 的个数(奇数右移一位会丢失最低位的 1);如果 n 是偶数,则右移一位后,出现 1 的个数不变。其中,我们所要知道的 n>>1 出现 1 的个数,必然在前面计算已经得到,所以这一题可以使用动态规划来解决。

class Solution(object):def countBits(self, num):""":type num: int:rtype: List[int]"""bitCnt = [0]*(num+1)for i in range(1, num+1):bitCnt[i] = bitCnt[i>>1] + i%2return bitCnt

 

链接:https://leetcode.com/problems/counting-bits/

这篇关于【LeetCode】338. 计算比特位的数目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/543514

相关文章

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

XTU 1237 计算几何

题面: Magic Triangle Problem Description: Huangriq is a respectful acmer in ACM team of XTU because he brought the best place in regional contest in history of XTU. Huangriq works in a big compa

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists