解法一:动态规划
dp[i] 表示 i 的二进制形式中 1 的个数。因此有以下DP方程。
我的解法和官方题解的第二种是一个思路。
class Solution {public int[] countBits(int num) {// dp[i]表示i的二进制形式中1的个数int[] dp = new int[num + 1];dp[0] = 0;for (int i = 1, x = 1; i <= num; ++i) {// i=2^k, dp[i]=1if (i == x) {dp[i] = 1;x <<= 1;} else {dp[i] = 1 + dp[i - (x >> 1)];}}return dp;}}
解法二:动态规划
参考官方题解的三、四两种方法。第三种我觉得还是可以想到的,第四种实在是太巧妙了。
class Solution {public int[] countBits(int num) {// dp[i]表示i的二进制形式中1的个数int[] dp = new int[num + 1];for (int i = 1; i <= num; ++i) {dp[i] = dp[i >> 1] + (i & 1);}return dp;}}
class Solution {public int[] countBits(int num) {// dp[i]表示i的二进制形式中1的个数int[] dp = new int[num + 1];for (int i = 1; i <= num; ++i) {dp[i] = dp[i & (i - 1)] + 1;}return dp;}}
