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!
評論