Description

給定兩個非負整數 lowhigh,回傳 lowhigh(含)之間的奇數個數。

Example:

Input: low = 3, high = 7 Output: 3 (3, 5, 7)

Intuition#

核心思路:用數學公式直接計算,不需要遍歷——[0, n] 中有 (n + 1) / 2 個奇數。

  • 暴力遍歷 O(n) 太慢,需要 O(1) 的數學公式
  • [0, n] 中的奇數個數為 (n + 1) / 2(整數除法)
  • [low, high] 中的奇數個數 = [0, high] 的奇數數量 - [0, low-1] 的奇數數量

Approaches#

1: 數學公式(前綴相減)#

  • 概念: 利用 [0, n] 中奇數個數的公式,用前綴差計算區間內的奇數個數
  • 時間複雜度: O(1)
  • 空間複雜度: O(1)
class Solution {
    fun countOdds(low: Int, high: Int): Int {
        // [0, n] 中有 (n + 1) / 2 個奇數
        // [low, high] = [0, high] - [0, low - 1]
        return (high + 1) / 2 - low / 2
    }
}

⭐2: 直覺公式#

  • 概念: 區間共 high - low + 1 個數,一半是奇數一半是偶數;如果端點任一為奇數則多一個奇數
  • 時間複雜度: O(1)
  • 空間複雜度: O(1)
class Solution {
    fun countOdds(low: Int, high: Int): Int {
        val count = high - low + 1
        return if (low % 2 == 1 || high % 2 == 1) {
            count / 2 + 1
        } else {
            count / 2
        }
    }
}

🔑 Takeaways#

  • Pattern: 區間計數問題用前綴差公式 O(1) 求解
  • 關鍵技巧: (high + 1) / 2 - low / 2 是最簡潔的公式,利用整數除法的截斷特性