思路其实挺简单的:

    1. 当数为偶数时,dp[i] = dp[i / 2],当为奇数时,dp[i] = dp[i - 1] + 1

      1. class Solution {
      2. public int[] countBits(int n) {
      3. // dp[i] 表示n所对应的1的数量
      4. int[] dp = new int[n + 1];
      5. for (int i = 1; i <= n; i++) {
      6. if ((i & 1) == 0) {
      7. // odd
      8. dp[i] = dp[i / 2];
      9. } else {
      10. dp[i] = dp[i - 1] + 1;
      11. }
      12. }
      13. // printArr(dp);
      14. return dp;
      15. }
      16. private void printArr(int[] arr) {
      17. for (int i : arr) {
      18. System.out.print(i + " ");
      19. }
      20. }
      21. }