1. 程式人生 > 實用技巧 >p158 連續自然數二進位制中 1 的個數(leetcode 338)

p158 連續自然數二進位制中 1 的個數(leetcode 338)

一:解題思路

方法一:之前做過一道求一個正整數二進位制中1的個數的題目,利用這個題目為基礎,然後遍歷從1-n 這n+1 個數字。Time:O(n*k),Space:O(1)

方法二:利用動態規劃的思想來做,遞推公式為:d[i]=d[i&(i-1)]+1。Time:O(n),Space:O(1)

二:完整程式碼示例 (C++版和Java版)

方法一C++:

class Solution 
{
private:
    int theNumberOfOne(int n)
    {
        int count = 0;

        while (n != 0)
        {
            count
++; n &= (n-1); } return count; } public: vector<int> countBits(int num) { vector<int> d(num+1,0); for (int i = 0; i <= num; i++) { d[i] = theNumberOfOne(i); } return d; } };

方法一Java:

class Solution 
    {
        private int theNumberOfOne(int num)
        {
               int count=0;
               
               if(num!=0)
               {
                   count++;
                   num&=(num-1);
               }
               
               return count;
        }
        
        
public int[] countBits(int num) { int[] d=new int[num+1]; for(int i=0;i<=num;i++) { d[i]=theNumberOfOne(i); } return d; } }

方法二C++:

class Solution 
{
public:
    vector<int> countBits(int num) 
    {
        vector<int> d(num+1,0);

        for (int i = 1; i <= num; i++)
        {
            d[i] = d[i& (i - 1)] + 1;
        }

        return d;
    }
};

方法二Java:

class Solution 
    {
        public int[] countBits(int num) 
        {
               int[] d=new int[num+1];
               
               for(int i=1;i<=num;i++)
               {
                   d[i]=d[i & (i-1)]+1;
               }
               
               return d;
        }
    }