338. Counting Bits(python+cpp)
阿新 • • 發佈:2018-11-16
題目:
Given a non negative integer number
num
. For every numbersi
in the range0 ≤ i ≤ num
calculate the number of 1’s in their binary representation and return them as an array.
Example 1:Input: 2 Output: [0,1,1]
Example 2:
Input: 5 Output: [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.
解釋:
用動態規劃做:
如果i是偶數,那麼i中1的個數和i/2中1的個數是一樣的
如果i是奇數,那麼i中1的個數和i/2中1的個數+1。
所以主要問題就是判斷i的奇偶性,可以用i&1來判斷
用位運算比用除法速度快。
python程式碼:
class Solution(object):
def countBits(self, num):
"""
:type num: int
:rtype: List[int]
"""
result=[0]
for i in xrange(1, num+1):
result.append(result[i>>1]+(1&i))
return result
c++程式碼:
class Solution {
public:
vector<int> countBits(int num) {
vector<int> result={0};
for (int i=1;i<=num;i++)
{
result.push_back(result[i>>1]+(i& 1));
}
return result;
}
};
總結:
位移運算比乘除法速度更快。