338. Counting Bits
位计数:给定一个数num,求从0-num之间每个数字的二进制位中1的个数。
要求:
1.时间复杂度是O(n)
2.空间复杂度也是O(n)
以上两个要求也就限制了我们不能使用简单的暴力求解的方法去解决该问题,必须去总结数据中的规律,找到更简单的方法。
0 0
1 1
2 10
3 11
4 100
5 101
6 110
7 111
8 1000
......
假设一个数有n位,那么该数的二进制位中1的个数等于最后一位中1的个数和前n-1位所对应的数字的二进制位中1的个数之和。
即numBits[i] = numBits[i>>1] + i%2
有了这个公式,问题迎刃而解,如下图所示的代码。
提交结果如图所示: