338. Counting Bits
題目網址:https://leetcode.cn/problems/counting-bits/
題意:給一整數
n
, 對於0 ≤ i ≤ n
中的每個i
, 計算其在二進制中1
的個數, 返回一個長度為n + 1
的 array 作為答案。
Solution 1:
想法:判斷
i
最靠右的 bit 是否為1
。若是的話, 則cnt++
, 每次判斷完後就將i
右移一位, 直到i = 0
(沒有 1-bit)為止
class Solution { |
- time:$O(n \cdot log(n))$ ➔ $n * O(log(n))$
- $O(log(n))$ :
n
右移1
位等價n
除以2
, 令k
為右移次數, $\dfrac{n}{2^k} = 1$ ➔ $k = log(n)$
- $O(log(n))$ :
- space:$O(1)$ ➔ 若不考慮要返回的 array, 只需常數空間
Solution 2:
想法:利用 DP, 因為透過觀察發現:
1. 前一數(偶數)的 1 之個數 + 1, 因為偶數最右邊的 bit 必為 0, 奇數多的就是最右邊的 bit
- e.g. 3 = 011, 2 = 010 ➔ 故 3 的 1 之個數 = 2 的 1 之個數 + 1
2. 偶數的 1 之個數 = (該數 / 2) 的 1 之個數, 因為偶數最右邊的 bit 必為 0, 所以偶數往右移一位, 該數的 1 之個數並不會減少
class Solution { |
- time:$O(n)$ ➔ $n * O(1)$
dp[i]
都是去存取先前已計算過的dp[i-1]
或dp[i >> 1]
, 故每一次計算dp[i]
故只需花 $O(1)$
- space:$O(1)$ ➔ 若不考慮要返回的 array, 只需常數空間
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論