码迷,mamicode.com
首页 > 其他好文 > 详细

每日一题——动态规划+位运算

时间:2021-03-04 12:54:54      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:理解   特性   bit   规划   范围   比较   方法   取消   设置   

338. 比特位计数
给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
示例 1:
输入: 2
输出: [0,1,1]
示例 2:
输入: 5
输出: [0,1,1,2,1,2]

解答

很明显,根据前面的结果得出后面的结果,才可能达到O(N)的效率,依据就是位模式的特性。
有三种动态规划方法:
最低有效位
bits[i] = bits[i >> 1] + i & 1; //i & 1为被舍弃的位
最低设置位
bits[i] = bits[i&(i-1)] + 1 //1为最低设置位
最高有效位
bias = (i & (i-1)) ? bias : i;
bits[i] = bits[i - bias] + 1; //1即为最高有效位,也为最低设置位

最低设置位的计算

这里出现了一种特殊的位运算:i&(i-1)。这是用来取消【最低设置位】的。定义【最低设置位】为1的权值最低的位。
如:10-1000 & 10-0111 = 10-0000
现在最高有效位方法中的判断方法就好理解了。想要计算i是否位为2的幂次,因为2的幂次表现为100000,最高有效位就是最低设置位,这时只需要计算最低有效位被消除后最高有效位是否还保留,即是否为全0。

位运算的优先级

在C++中,逻辑 < 位运算的优先级 < 比较 < 算术,处在非常低的位置,所以尽量要加括号
例如:(i >> 1) == 1, (i >> 1) - 1

每日一题——动态规划+位运算

标签:理解   特性   bit   规划   范围   比较   方法   取消   设置   

原文地址:https://www.cnblogs.com/laiyk/p/14473896.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!