在既定时间做作业的学生人数

标签: 数组

难度: Easy

给你两个整数数组 startTime(开始时间)和 endTime(结束时间),并指定一个整数 queryTime 作为查询时间。

已知,第 i 名学生在 startTime[i] 时开始写作业并于 endTime[i] 时完成作业。

请返回在查询时间 queryTime 时正在做作业的学生人数。形式上,返回能够使 queryTime 处于区间 [startTime[i], endTime[i]](含)的学生人数。

示例 1:

输入:startTime = [1,2,3], endTime = [3,2,7], queryTime = 4
输出:1
解释:一共有 3 名学生。
第一名学生在时间 1 开始写作业,并于时间 3 完成作业,在时间 4 没有处于做作业的状态。
第二名学生在时间 2 开始写作业,并于时间 2 完成作业,在时间 4 没有处于做作业的状态。
第三名学生在时间 3 开始写作业,预计于时间 7 完成作业,这是是唯一一名在时间 4 时正在做作业的学生。

示例 2:

输入:startTime = [4], endTime = [4], queryTime = 4
输出:1
解释:在查询时间只有一名学生在做作业。

示例 3:

输入:startTime = [4], endTime = [4], queryTime = 5
输出:0

示例 4:

输入:startTime = [1,1,1,1], endTime = [1,3,2,4], queryTime = 7
输出:0

示例 5:

输入:startTime = [9,8,7,6,5,4,3,2,1], endTime = [10,10,10,10,10,10,10,10,10], queryTime = 5
输出:5

提示:

  • startTime.length == endTime.length
  • 1 <= startTime.length <= 100
  • 1 <= startTime[i] <= endTime[i] <= 1000
  • 1 <= queryTime <= 1000

Submission

运行时间: 24 ms

内存: 16.1 MB

class Solution:
    def busyStudent(self, startTime: List[int], endTime: List[int], queryTime: int) -> int:
        ans = 0
        for start, end in zip(startTime, endTime):
            if start <= queryTime and queryTime <= end:
                ans += 1
        return ans

Explain

该题解的思路是直接遍历每个学生的开始和结束时间,检查给定的查询时间是否位于每个学生的作业时间区间内。具体实现中,使用了zip函数来同时遍历两个列表——startTime与endTime。对于每一对开始和结束时间,如果查询时间落在这个区间内(包含区间边界),则计数器增加。最后返回这个计数器的值,它表示在查询时间正在做作业的学生人数。

时间复杂度: O(n)

空间复杂度: O(1)

class Solution:
    def busyStudent(self, startTime: List[int], endTime: List[int], queryTime: int) -> int:
        ans = 0  # 用于计数正在做作业的学生数
        for start, end in zip(startTime, endTime):  # 同时遍历开始时间和结束时间
            if start <= queryTime and queryTime <= end:  # 检查查询时间是否在当前学生的作业时间区间内
                ans += 1  # 如果是,计数器增加
        return ans  # 返回计数结果

Explore

使用zip函数来同时遍历startTime和endTime列表的主要优势在于代码的简洁性和可读性。通过zip函数,可以便利地同时从两个列表中取出相应的元素,使得代码更加直观和易于理解。此外,zip处理了两个列表长度不一致的情况,它会在最短的列表结束时停止,这意味着如果startTime和endTime的长度不一,zip将只会遍历到最短列表的末尾。在本题的上下文中,假设startTime和endTime列表长度应该相同,因为每个学生的开始时间应该对应一个结束时间。如果实际应用中这两个列表长度不一致,可能需要额外的逻辑来处理这种情况,例如通过异常处理或检查列表长度来确保数据的一致性。

该算法的时间复杂度为O(n),其中n是startTime和endTime列表中的元素数量。这意味着算法的执行时间与列表中学生的数量成线性关系。因此,如果列表非常大,算法的执行时间也会相应增加。在处理大量数据时,这种线性时间复杂度通常是可接受的,但对于极大的数据量,算法的执行效率可能会成为瓶颈。在这种情况下,可能需要考虑更高效的数据结构或算法,例如使用时间区间树或分段统计等方法,以提高查询效率。

算法的计算效率不会因为queryTime的值非常小或非常大而改变。无论queryTime的值如何,算法都必须遍历所有的startTime和endTime对来确定有多少学生在该时间点正在做作业。因此,算法的时间复杂度始终为O(n)。不过,如果queryTime超出了所有startTime和endTime的范围,虽然计算效率不变,算法的输出结果将始终为0,因为没有学生在该时间做作业。