Skip to main content

🟩 Counting Bits (#338)

📋 Problem Statement​

💡 Examples​

Example 1​

Input: n = 2
Output: [0,1,1]

Example 2​

Input: n = 5
Output: [0,1,1,2,1,2]

🔑 Key Insights & Approach​

Core Observation: dp[i] = dp[i >> 1] + (i & 1). Use previous results.

Why DP?

  • O(n) time, O(1) extra space
  • Reuse previous counts
  • i >> 1 removes rightmost bit

Pattern: "Bit DP" pattern.

🐍 Solution: Python​

Approach: DP with Bit Shift​

Time Complexity: O(n) | Space Complexity: O(1)

from typing import List

class Solution:
def countBits(self, n: int) -> List[int]:
dp = [0] * (n + 1)

for i in range(1, n + 1):
dp[i] = dp[i >> 1] + (i & 1)

return dp

🔵 Solution: Golang​

Approach: DP​

Time Complexity: O(n) | Space Complexity: O(1)

func countBits(n int) []int {
dp := make([]int, n+1)

for i := 1; i <= n; i++ {
dp[i] = dp[i>>1] + (i & 1)
}

return dp
}

📚 References​