当前位置: 首页 > news >正文

LeetCode 算法题【简单】338. 比特位计数

语雀原文链接

1、LeetCode 链接

  • 官方链接:https://leetcode.cn/problems/counting-bits/description/
  • 标签:位运算
给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。示例 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 log n) 的解决方案,你可以在线性时间复杂度 O(n) 内用一趟扫描解决此问题吗?
你能不使用任何内置函数解决此问题吗?(如,C++ 中的 __builtin_popcount )

2、个人写法

  • 思路:除以2取余数
  • 时间复杂度:O(NLogN)
  • 空间复杂度:O(N)
class Solution {public int[] countBits(int n) {int[] ans = new int[n+1];for(int i = 0; i <= n; i++){int count = 0;int temp = i;while(temp > 0){if(temp % 2 == 1){count++;}temp = temp / 2;}ans[i] = count;}return ans;}
}

3、更优写法

优化写法1:x=x & (x−1)

  • 思路:Brian Kernighan 算法:利用Brian Kernighan 算法,可以在一定程度上进一步提升计算速度。Brian Kernighan 算法的原理是:对于任意整数 x,令 x=x & (x−1),该运算将 x 的二进制表示的最后一个 1 变成 0。因此,对 x 重复该操作,直到 x 变成 0,则操作次数即为 x 的「一比特数」。
  • 举例
数字3的二进制 0011
第一次 3 & 2 = 0011 & 0010 = 0010 = 2 去除了最后一个1
第二次 2 & 1 = 0010 & 0001 = 0000 = 0 又去除了最后一个1
重复了两次,所以3的二进制总共有两个1
  • 时间复杂度:O(NLogN)
  • 空间复杂度:O(N)
class Solution {public int[] countBits(int n) {int[] ans = new int[n+1];for(int i = 0; i <= n; i++){ans[i] = countOnes(i);}return ans;}public int countOnes(int num){int count = 0;while(num > 0){num &= (num -1);count++;}return count;}
}

优化写法2:y=x & (x−1) x 比 y多一个1

  • 思路:令 y=x & (x−1),则 y 为将 x 的最低设置位从 1 变成 0 之后的数,显然 0≤y<x,bits[x]=bits[y]+1。因此对任意正整数 x,都有 bits[x]=bits[x & (x−1)]+1。
  • 时间复杂度:O(n)。对于每个整数,只需要 O(1) 的时间计算「一比特数」。
  • 空间复杂度:O(1)。除了返回的数组以外,空间复杂度为常数。
class Solution {public int[] countBits(int n) {int[] bits = new int[n + 1];for (int i = 1; i <= n; i++) {bits[i] = bits[i & (i - 1)] + 1;}return bits;}
}
http://www.dtcms.com/a/411653.html

相关文章:

  • 买房网站排名福州做网站建设公司
  • 爱思强交付第100套G10-SiC系统
  • 网站的建设要多少钱求推荐专门做借条的网站
  • 在线旅游攻略网站建设方案做网站要注册第35类商标吗
  • RocketMQ 核心知识整理:工作原理、常用命令与常见问题解决
  • 做养生网站怎么赚钱麻涌建设网站
  • 域名备案 没有网站网站建设意见建议表
  • Unity-Statemachinebehaviour状态机行为脚本
  • 网站问题图片房子网站有哪些
  • 孝感应城网站建设长春网站建设 找源晟
  • 如何设置网站服务器常州做网站哪家便宜
  • 单片机引脚的高电平和低电平范围值
  • 设计师可以做兼职的网站创建网站的基本步骤
  • 网站后台开发做什么凡科网网站建设
  • 什么是合同管理系统?6个核心功能介绍
  • 数据采集技术:03 有关实时采集
  • 双有源桥DAB仿真控制simulink模型大合集,simulink仿真模型。
  • 石家庄的网站的公司沈阳个人网站制作
  • 网站建设属于移动互联网青岛网站seo诊断
  • Mish激活函数:一种自正则化的非单调神经激活函数
  • Stanford CS336 assignment1(上)
  • 做网站一般几个人完成做简历的网站 知乎
  • 【思考】作为“纯硬件”的ADC芯片,它是如何识别并处理SPI命令的?
  • 申请自助建站多点网络网站制作系统
  • 郑州网站优化seo网站的设计思路怎么写
  • 影刀 RPA:定时推送信息,高效便捷省心
  • 深度学习Pytorch入门(1):手撕CIFAR 10影像分类
  • Next.js 和VUE 区别对比总结
  • 网站建设这块是怎么挣钱的网络稿件投稿平台
  • 安徽建设银行 招聘网站wordpress自媒体博客模板