news 2026/4/18 10:16:20

Counting Bits LeetCode 高效解法解析与位运算技巧

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Counting Bits LeetCode 高效解法解析与位运算技巧

Counting Bits是LeetCode第338题,要求计算从0到给定整数n之间每个数字的二进制表示中1的个数。这个问题看似简单,但高效解法涉及位运算和动态规划的巧妙结合,是面试中考察候选人算法思维能力的经典题目。

counting bits leetcode题目是什么意思

这道题给定一个非负整数n,需要返回一个长度为n+1的数组,其中第i个元素表示数字i的二进制形式中1的个数。例如,当n=5时,二进制表示分别为0(0), 1(1), 2(10), 3(11), 4(100), 5(101),所以应该返回[0,1,1,2,1,2]。题目要求时间复杂度尽可能低,避免对每个数字单独计算。

理解题目后,最直接的思路是对每个数字计算其二进制中1的个数,但这会导致O(nsizeof(integer))的时间复杂度。在实际面试中,面试官通常期待更优的解法,这就需要我们深入分析数字二进制表示的内在规律。

counting bits leetcode如何高效解决

高效解决Counting Bits问题的关键在于发现相邻数字二进制表示之间的关系。通过观察可以发现,对于任意偶数i,其二进制中1的个数等于i/2的二进制中1的个数,因为偶数二进制最后一位是0,右移一位相当于除以2。对于奇数i,其二进制中1的个数等于i/2的二进制中1的个数加1。

基于这个规律,我们可以推导出状态转移方程:bits[i] = bits[i>>1] + (i & 1)。这里i>>1表示i右移一位(即除以2),i & 1用于判断i是否为奇数。这种方法只需一次遍历即可完成计算,时间复杂度为O(n),空间复杂度也为O(n)。

counting bits leetcode动态规划解法

上述解法本质上是一种动态规划思路,其中bits[i]表示状态,即数字i的二进制中1的个数。状态转移基于已计算的较小数字的结果,充分利用了子问题的解。具体实现时,初始化bits[0]=0,然后从1遍历到n,根据状态转移方程计算每个bits[i]。

在实际编码中,这个解法非常简洁高效。Python实现只需几行代码:def countBits(n): bits = [0]

(n+1); for i in range(1, n+1): bits[i] = bits[i>>1] + (i & 1); return bits。这种解法不仅高效,而且体现了将问题分解为子问题并重复利用结果的动态规划核心思想。

你在解决Counting Bits问题时是否考虑过其他优化方法?在实际面试中遇到这道题,你通常会如何向面试官解释解题思路?欢迎在评论区分享你的经验和看法,如果觉得这篇文章有帮助,请点赞和分享给更多正在准备技术面试的朋友。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 7:59:36

Fault Locator V2电路图详解与故障快速定位指南

理解Fault Locator V2电路图是有效使用这款设备进行故障诊断的基础。这张图纸不仅仅展示了元器件的连接关系,更揭示了信号探测、逻辑判断和结果指示的完整流程。掌握其设计思路,能让你在面对复杂电路故障时,快速、准确地找到问题根源&#xf…

作者头像 李华
网站建设 2026/4/18 9:34:24

Canvas坐标系统详解:工作原理与像素关系

理解Canvas坐标系统是掌握HTML5 Canvas绘图的基础。Canvas使用二维笛卡尔坐标系,原点(0,0)位于画布的左上角,x轴向右递增,y轴向下递增。这个坐标系决定了图形绘制的位置和大小,是所有Canvas操作的核心参考框架。 canvas 坐标系统是…

作者头像 李华
网站建设 2026/4/17 9:03:40

Prolog事实用法教程:定义语法与应用实例详解

Prolog中的“事实”是构成知识库的基石,它描述了世界中被认为是真的、无需证明的基本信息。理解事实是掌握Prolog逻辑编程的第一步,它直接决定了程序如何表达知识以及后续如何通过规则进行推理。本部分将深入讲解事实的定义、语法及其在实际查询中的应用…

作者头像 李华
网站建设 2026/4/18 7:36:53

cformview初始化 详解MFC CFormView正确初始化步骤

CFormView初始化是MFC应用程序开发中的一个关键环节,它确保了基于对话框资源的视图能够正确加载界面控件并建立数据映射。如果初始化不当,可能导致界面显示异常、数据绑定失效甚至程序崩溃。掌握初始化的核心要点,能显著提升开发效率和程序稳…

作者头像 李华
网站建设 2026/4/17 22:10:33

汽车工程师在焦虑中释怀的2025年

作者 | 小皮知乎 链接丨https://zhuanlan.zhihu.com/p/1989689030607124116 编辑 | 自动驾驶之心 点击下方卡片,关注“自动驾驶之心”公众号 戳我-> 领取自动驾驶近30个方向学习路线 >>国内首个自动驾驶全栈交流社区:自动驾驶之心知‍识星球&am…

作者头像 李华
网站建设 2026/4/18 6:51:45

告别复杂配置!CosyVoice2-0.5B一键部署语音克隆

告别复杂配置!CosyVoice2-0.5B一键部署语音克隆 你是否试过为一段产品介绍配音,却卡在环境搭建、依赖冲突、CUDA版本不匹配上?是否下载了十几个GB的模型权重,最后发现连推理界面都打不开?别再折腾了——今天带你用一行…

作者头像 李华