难度:Medium
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 1:Input: 2Output: [0,1,1]Example 2:Input: 5Output: [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.
这题可以采用与78.subsets相似的方法,循环,然后判断位数。
class Solution {public:vector<int> countBits(int num) {int s= log(num)/log(2);if(pow(2,s) <num) s+=1;int N= 1;int count =1;vector<int> res(num+1, 0);for(int i=1;i<=num;i++){int count =0;for(int j=0;j<=s;j++)if(i & (1<<j)) count++;res[i] = count;}return res;}};
执行用时 :152 ms, 在所有 C++ 提交中击败了8.83%的用户 内存消耗 :9.9 MB, 在所有 C++ 提交中击败了3.54%的用户
但是效率较低,可以采用动态规划的方法,对于一个数,通过该数的1/2的位数和该数末尾是否为1来确定该数的位数。
class Solution {vector <int > counts={0,1,1,2,1};public:vector<int> countBits(int num) {if(num <counts.size()){vector<int > res(counts.begin(), counts.begin()+num+1);return res;}for(int i=counts.size(); i<=num;i++)counts.push_back( counts[i/2] + i%2);return counts;}};
执行用时 :84 ms, 在所有 C++ 提交中击败了67.28%的用户 内存消耗 :10.8 MB, 在所有 C++ 提交中击败了5.19%的用户