递推就好了
所有2的次方均只有1个1
以每个2的次方为一段
遍历i从2到n
temp为当前不大于i的最大的2的次方
ret[i] = ret[temp] + ret[i - temp]
class Solution { public: vector<int> countBits(int n) { int vis[100010]; memset(vis, 0, sizeof(vis)); int cr = 1; for(int i = 1; cr * 2 < 100000; i++) { cr = cr * 2; vis[cr] = 1; } int temp = 0; vector<int> ret; ret.push_back(0); if(n > 0) ret.push_back(1); for(int i = 2; i <= n; i++) { if(vis[i]) ret.push_back(1), temp = i; else ret.push_back(ret[temp] + ret[i - temp]); } return ret; } };