【算法】 - 动态规划 + 位运算
题目描述
思路1:
- 写一个返回2进制中1数量的函数countOne
- 遍历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的个数的速率可以提升,可以考虑采用位运算来求
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:
找到后面数与前面数的联系,利用缓存进一步加速
- 对于十进制10来说,其对应的二进制为"1010",其1的位数dp[10]为十进制2中1的位数 + 1,其对应公式如下:
dp[10] = dp[2] + 1;
- 10与2之间其实只差一个十进制8(“1000”)
- 同理十进制13(“1101”)其1的个数可以由公式 dp[13] = dp[5] + 1 求出
十进制5的二进制对应"101"
- 因此可以得到递推关系式, 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;
};
【算法】 - 动态规划 + 位运算相关推荐
- Java数据结构和算法:位运算
位运算因为是CPU直接支持的操作指令,也是基于二进制的操作,所以具有相当高的效率,在一些场合,合理应用位运算将具有很高的性能.通常在一些加密算法,图型算法中都会使用到位运算. 移位运算符 运算符 含义 ...
- 算法:位运算加减乘除
今日做leetCode的371题算法题,用位运算计算两个数之和.借此机会,将位运算的加减乘除做一整理. package Algorithm;public class Code371 {public s ...
- 算法优化——位运算的优化技巧
1 致谢 感谢赵老师的讲授! 2 前言 今天在学习算法与数据结构~ 赵老师给我们讲了一点位运算的使用技巧,感觉还挺有意思的,这里记录一下~ 3 位运算的优化技巧 n&1判断奇偶性 使用n&am ...
- C++ 算法篇 位运算
学习目标 1. 理解与掌握 C++ 中的位运算. 2. 灵活应用位运算优化程序. 任何信息在计算机中都是采用二进制表示的,数据在计算机中是以补码形式存储的,位运算就是直接对整数在内存中的二进制位进行 ...
- 【基础算法训练】—— 线性动态规划+位运算
目录
- 【基本算法】 位运算:二进制状态压缩
二进制状态压缩 二进制状态压缩,是指将一个n位的 bool 数组用 n 位的二进制数表示的方法. OP 运算 取出 n 在二进制表示下的第k位 (n >> k) & 1 取出 n ...
- 【算法】位运算——左移右移
1.左移运算符(<<) 定义:将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0). 设 a=1010 1110,a = a<< 2 将a的二进制位左移2位 ...
- 剑指offer 算法 (位运算)
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. class Solution { public:int NumberOf1(int n) {//方法一:(包含二进制负数不成 ...
- 有趣的二进制—高效位运算
2019独角兽企业重金招聘Python工程师标准>>> 上一篇<有趣的二进制>我们讲到二进制的一些基础知识,但没有讲到位运算,有同学大呼不过瘾,那这一篇主要讲解下位运算的 ...
最新文章
- 天之痕java版不能捉妖_〖天之痕游戏常见问题汇总(更新版)〗
- 解密时刻:机器学习能力太强好吗?
- python题目关于企业利润_【每日一练】巧用python实现利润计算
- 查看windows系统当前使用的字符集
- C++模拟实现Objective-C协议和代理模式
- 解析H.264视频编解码DSP实现与优化
- java事件大全_JavaScript事件大全
- 台式计算机机箱型号及价格,顶级组装台式电脑配置清单
- Python GUI项目:文件夹管理系统
- BZOJ3168: [Heoi2013]钙铁锌硒维生素
- series 合并pandas_在python中pandas的series合并方法
- iOS 如何获取手机外网IP地址(附内网IP地址)
- 新增网站组网方案与解释说明
- Python生成兔年祝福词云图,快拿去发给小姐姐吧!祝大家兔年大吉,桃花运多多
- C语言中字符数组的初始化与赋值,字符串相关函数
- iOS中几种数据持久化方案-转自简书
- PHP - Yii2编码规范/风格[PSR-1/PSR-2]
- 使用idea pom.xml文件打开就报错
- 算法 · 深入理解 Fibonacci 数列计算及黄金分割
- 机器学习算法---神经网络
热门文章
- 使用MATLAB和Vivado读取txt文件
- android静默卸载,Android实践 -- Android静默安装和卸载
- java中include标签的用法_原 ng-include用法分析以及多标签页面的简单实现方式
- shiro如何保证session不失效_请问在不加锁的情况下如何保证线程安全?
- flip java_java的flip(). 这里用flip()有什么作用?这是反转缓冲区的方法,好像用不上。...
- 六年级下册百分数计算题_小学六年级数学期末考,题量较大,出题全面、灵活...
- Python环境搭建及第三方库安装和卸载
- ASP.NET Core Web 应用程序开发期间部署到IIS自定义主机域名并附加到进程调试
- 【TCP传输数据-键盘录入】
- Pots (BFS ➕ 输出路径)