题目所属分类
原题链接
给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。
代码案例:输入:n = 2
输出:[0,1,1]
解释:
0 --> 0
1 --> 1
2 --> 10
题解
(动态规划) O(n)
令f[i]
表示 i
的二进制表示中1的个数。
则f[i]可以由f[i/2]
转移过来,i 的二进制表示和 ⌊i/2⌋
的二进制表示除了最后一位都一样,所以f[i] = f[i/2] + (i&1);
时间复杂度分析:总共有 n 个状态,每个状态进行转移的计算量是 O(1) ,所以总时间复杂度是 O(n) 。
class Solution {
public int[] countBits(int n) {
int[] f = new int[n + 1];
for(int i = 1 ; i <= n ; i++){
f[i] = f[i >> 1] + (i & 1);
}
return f ;
}
}