在区间范围内统计奇数数目

标签: 数学

难度: Easy

给你两个非负整数 low 和 high 。请你返回 low  high 之间(包括二者)奇数的数目。

示例 1:

输入:low = 3, high = 7
输出:3
解释:3 到 7 之间奇数数字为 [3,5,7] 。

示例 2:

输入:low = 8, high = 10
输出:1
解释:8 到 10 之间奇数数字为 [9] 。

提示:

  • 0 <= low <= high <= 10^9

Submission

运行时间: 16 ms

内存: 16.0 MB

class Solution:
    def countOdds(self, low: int, high: int) -> int:

        if high%2==0 and low%2==0:
            tmp = (high - low) // 2
            return tmp
        else:
            tmp = ((high - low) // 2 + 1)
            return tmp





Explain

题解采用直接计算法,利用数学的方式来确定区间内奇数的数量,而不是逐个检查每个数字。关键的思路是根据区间的端点是奇数还是偶数来决定如何计算。如果两个端点low和high都是偶数,那么奇数的个数为(high - low) / 2。如果任一端点为奇数,则需要将计算结果加一,因为包括至少一个端点的奇数在内。

时间复杂度: O(1)

空间复杂度: O(1)

class Solution:
    def countOdds(self, low: int, high: int) -> int:
        # 检查high和low是否都是偶数
        if high % 2 == 0 and low % 2 == 0:
            tmp = (high - low) // 2
            return tmp  # 返回计算结果
        else:
            tmp = ((high - low) // 2 + 1)
            return tmp  # 包括端点奇数时,结果加一

Explore

在给定的区间[low, high]内,如果区间两端low和high都是偶数,区间内奇数的数量等于(high - low) / 2。这是因为从一个偶数开始到另一个偶数结束,每两个数中恰好包含一个奇数。例如,从2到8的区间是2, 3, 4, 5, 6, 7, 8,其中奇数为3, 5, 7,共三个。如果其中一个或两个端点是奇数,那么区间内至少包括一个端点的奇数,因此计算公式调整为(high - low) // 2 + 1,以确保至少包括一个端点的奇数被计数。

当low和high都是奇数时,奇数的数量计算为(high - low) // 2 + 1。这是因为两个奇数之间的间隔包含了偶数和奇数的完整周期,每两个数包含一个奇数。由于我们从一个奇数开始并在另一个奇数结束,所以在整个计数中始终包括这两个奇数。例如,从3到7的区间是3, 4, 5, 6, 7,其中奇数为3, 5, 7,共三个,计算结果为(7 - 3) // 2 + 1 = 3。

确实,题解中的计算假设low和high都包含在计算范围内。如果high不包含在内,那么计算结果可能不同。例如,如果low是奇数而high是偶数,且high不包含在内,那么high前的最后一个数字是high-1,如果这是奇数,则计算结果不变;如果是偶数,则应减去1。因此,是否加1取决于high前的数字是否为奇数。

当low和high非常接近时,直接计算法可能看起来更简单,因为只需检查一个或两个数字。然而,使用数学计算方法,无论low和high的差距多大,都可以快速得出结果,且计算复杂度始终为O(1)。这意味着计算时间不随区间大小而变化,尤其是对于大范围的区间,这种方法的效率更高,避免了遍历整个区间的需要。