题目描述

思路1:

  1. 写一个返回2进制中1数量的函数countOne
  2. 遍历0到num,对每一个数使用countOne,并将结果保存到res中返回
var countBits = function (num) {let res = new Array(num + 1).fill(0);for (let i = 0; i <= num; i++) {res[i] = countOne(i.toString(2));}return res;
};const countOne = num => {let res = 0;for (let i = 0; i < num.length; i++) {if (num[i] == 1) {res++;}}return res;
}

思路2:

  1. 上面求1的个数的速率可以提升,可以考虑采用位运算来求
var countBits = function (num) {let res = new Array(num + 1).fill(0);for (let i = 0; i <= num; i++) {res[i] = countOne(i);}return res;
};const countOne = num => {let res = 0;while (num > 0) {res++;num = num & (num - 1);}return res;
}

思路3:

找到后面数与前面数的联系,利用缓存进一步加速

  1. 对于十进制10来说,其对应的二进制为"1010",其1的位数dp[10]为十进制2中1的位数 + 1,其对应公式如下:

dp[10] = dp[2] + 1;

  1. 10与2之间其实只差一个十进制8(“1000”)
  2. 同理十进制13(“1101”)其1的个数可以由公式 dp[13] = dp[5] + 1 求出

十进制5的二进制对应"101"

  1. 因此可以得到递推关系式, dp[i] = dp[i - highBit] + 1;

其中 highBit是不超过i的2的最大整数次幂
算法如下:

var countBits = function (num) {let dp = new Array(num + 1).fill(0);let highBit = 0;for (let i = 1; i <= num; i++) {if ((i & (i - 1)) == 0) {highBit = i;}dp[i] = dp[i - highBit] + 1;}return dp;
};

【算法】 - 动态规划 + 位运算相关推荐

  1. Java数据结构和算法:位运算

    位运算因为是CPU直接支持的操作指令,也是基于二进制的操作,所以具有相当高的效率,在一些场合,合理应用位运算将具有很高的性能.通常在一些加密算法,图型算法中都会使用到位运算. 移位运算符 运算符 含义 ...

  2. 算法:位运算加减乘除

    今日做leetCode的371题算法题,用位运算计算两个数之和.借此机会,将位运算的加减乘除做一整理. package Algorithm;public class Code371 {public s ...

  3. 算法优化——位运算的优化技巧

    1 致谢 感谢赵老师的讲授! 2 前言 今天在学习算法与数据结构~ 赵老师给我们讲了一点位运算的使用技巧,感觉还挺有意思的,这里记录一下~ 3 位运算的优化技巧 n&1判断奇偶性 使用n&am ...

  4. C++ 算法篇 位运算

    学习目标 1. 理解与掌握 C++ 中的位运算.  2. 灵活应用位运算优化程序. 任何信息在计算机中都是采用二进制表示的,数据在计算机中是以补码形式存储的,位运算就是直接对整数在内存中的二进制位进行 ...

  5. 【基础算法训练】—— 线性动态规划+位运算

    目录

  6. 【基本算法】 位运算:二进制状态压缩

    二进制状态压缩 二进制状态压缩,是指将一个n位的 bool 数组用 n 位的二进制数表示的方法. OP 运算 取出 n 在二进制表示下的第k位 (n >> k) & 1 取出 n ...

  7. 【算法】位运算——左移右移

    1.左移运算符(<<) 定义:将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0). 设 a=1010 1110,a = a<< 2 将a的二进制位左移2位 ...

  8. 剑指offer 算法 (位运算)

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. class Solution { public:int NumberOf1(int n) {//方法一:(包含二进制负数不成 ...

  9. 有趣的二进制—高效位运算

    2019独角兽企业重金招聘Python工程师标准>>> 上一篇<有趣的二进制>我们讲到二进制的一些基础知识,但没有讲到位运算,有同学大呼不过瘾,那这一篇主要讲解下位运算的 ...

最新文章

  1. 天之痕java版不能捉妖_〖天之痕游戏常见问题汇总(更新版)〗
  2. 解密时刻:机器学习能力太强好吗?
  3. python题目关于企业利润_【每日一练】巧用python实现利润计算
  4. 查看windows系统当前使用的字符集
  5. C++模拟实现Objective-C协议和代理模式
  6. 解析H.264视频编解码DSP实现与优化
  7. java事件大全_JavaScript事件大全
  8. 台式计算机机箱型号及价格,顶级组装台式电脑配置清单
  9. Python GUI项目:文件夹管理系统
  10. BZOJ3168: [Heoi2013]钙铁锌硒维生素
  11. series 合并pandas_在python中pandas的series合并方法
  12. iOS 如何获取手机外网IP地址(附内网IP地址)
  13. 新增网站组网方案与解释说明
  14. Python生成兔年祝福词云图,快拿去发给小姐姐吧!祝大家兔年大吉,桃花运多多
  15. C语言中字符数组的初始化与赋值,字符串相关函数
  16. iOS中几种数据持久化方案-转自简书
  17. PHP - Yii2编码规范/风格[PSR-1/PSR-2]
  18. 使用idea pom.xml文件打开就报错
  19. 算法 · 深入理解 Fibonacci 数列计算及黄金分割
  20. 机器学习算法---神经网络

热门文章

  1. 使用MATLAB和Vivado读取txt文件
  2. android静默卸载,Android实践 -- Android静默安装和卸载
  3. java中include标签的用法_原 ng-include用法分析以及多标签页面的简单实现方式
  4. shiro如何保证session不失效_请问在不加锁的情况下如何保证线程安全?
  5. flip java_java的flip(). 这里用flip()有什么作用?这是反转缓冲区的方法,好像用不上。...
  6. 六年级下册百分数计算题_小学六年级数学期末考,题量较大,出题全面、灵活...
  7. Python环境搭建及第三方库安装和卸载
  8. ASP.NET Core Web 应用程序开发期间部署到IIS自定义主机域名并附加到进程调试
  9. 【TCP传输数据-键盘录入】
  10. Pots (BFS ➕ 输出路径)