338. Counting Bits
题目理解:
找到长度为n的数组, 每个位置的值为对应下标二进制下1的个数
思路:
先看一下二进制规律:
| 十进制 | 二进制 | 1的个数 | 
|---|---|---|
| 0 | 000 | 0 | 
| 1 | 001 | 1 | 
| 2 | 010 | 1 | 
| 3 | 011 | 2 | 
| 4 | 100 | 1 | 
| 5 | 101 | 2 | 
| 6 | 110 | 2 | 
| 7 | 111 | 3 | 
容易看出来, [4-7]的值正是[0-3]的值+1, 而[2-3]的值正是[0-1]的值+1, 他们的区别在于最高位的1出现在二进制的第几位, 以此来分组, 第二组的值总是为第一组的值+1
可以设定一个 gap 值, 若 gap = 2 认为现在在计算[2-3], 那么就是[0-1]+1就好了, 进而 gap = 4, 位于[4-7], 即为[0-3]+1, …… , gap = 2^n 位于 [2^n-2^(n-1)], 值为[0-2^n-1]+1
根据这个规则, 递推算出整个数组就完成了    
小结:
状态表示和状态转移方程在这道题不会表示…而且这个算法也不好, 需要计算gap的增加情况, 造成额外的开销, 看到别人的实际可以直接 v[i] = v[i&(i-1)] + 1(要考虑一些情况), 非常厉害实在佩服     
Submission Detail:
    
code:
1  | class Solution {  |