[LeetCode]338 Counting Bits(dp,lowbit)

题目链接:https://leetcode.com/problems/counting-bits/?tab=Description

题意:求[0~n]里各个数的二进制下1的个数。空间时间复杂度都要求O(num)。

很容易想出来递推关系,那就是二进制下x个1是由x-1个1表示的数字中+1过来的,然而如何用快速的方法表示这种关系。回忆到了BIT中的更新方式,很容易想到用lowbit来获取一个唯一的比当前数二进制下1的数少一个1的数。递推式就是f(i)=f(i-lowbit(i))+1。

 1 class Solution {
 2 public:
 3     int lowbit(int x) {
 4         return x & (-x);
 5     }
 6   vector<int> countBits(int num) {
 7       vector<int> f(num+1, 0);
 8       for(int i = 1; i <= num; i++) {
 9           f[i] = f[i-lowbit(i)] + 1;
10       }
11       return f;
12   }
13 };
原文地址:https://www.cnblogs.com/kirai/p/6530305.html