p158 連續自然數二進位制中 1 的個數(leetcode 338)
阿新 • • 發佈:2020-07-30
一:解題思路
方法一:之前做過一道求一個正整數二進位制中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; } }