• 338. Counting Bits(动态规划)


    Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1's in their binary representation and return them as an array.

    Example:
    For num = 5 you should return [0,1,1,2,1,2].

    Follow up:

    It is very easy to come up with a solution with run time O(n*sizeof(integer)). But can you do it in linear time O(n) /possibly in a single pass?

    • Space complexity should be O(n).
    • Can you do it like a boss? Do it without using any builtin function like __builtin_popcount in c++ or in any other language.

    分析:

    这道题完全没看别人的思路,自己想出来的第一道动态规划题目,开心<( ̄︶ ̄)>
    当n为奇数时,则n-1为偶数,由二进制可知,n-1的二进制最后一位必定是0
    而n的二进制就是在n-1的二进制最后一位加1,并未影响n-1的前面的情况,只把最后一位0,变为了1,所以当n=奇数时,dp[n]=dp[n-1]+1;
    举个栗子:6=1*(2^2)+1*(2^1)+0*(2^0),6的二进制是110.
             7=1*(2^2)+1*(2^1)+1*(2^0),7的二进制是111.
    当n为偶数时,先举个栗子吧,
             6=1*(2^2)+1*(2^1)+0*(2^0),6的二进制是110.
    n/2就是把每一项都除以2,但是你会发现每一项的系数是不变的,
            6/2=3=1*(2^1)+1*(2^0)+0(2^0)
    所以当n=偶数时,dp[n]=dp[n/2].
    
    class Solution {
    public:
        vector<int> countBits(int num) {
            vector<int> dp(num+1,0);
            for(int i=1;i<num+1;i++){
                if(i%2==0)
                    dp[i]=dp[i/2];
                else 
                    dp[i]=dp[i-1]+1;
            }
            return dp;
        }
    };
    
  • 相关阅读:
    10 个雷人的注释,就怕你不敢用!
    Java 14 之模式匹配,非常赞的一个新特性!
    poj 3661 Running(区间dp)
    LightOJ
    hdu 5540 Secrete Master Plan(水)
    hdu 5584 LCM Walk(数学推导公式,规律)
    hdu 5583 Kingdom of Black and White(模拟,技巧)
    hdu 5578 Friendship of Frog(multiset的应用)
    hdu 5586 Sum(dp+技巧)
    hdu 5585 Numbers
  • 原文地址:https://www.cnblogs.com/A-Little-Nut/p/8323535.html
Copyright © 2020-2023  润新知