【C/C++】1450. 在既定时间做作业的学生人数

262 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情


题目链接:1450. 在既定时间做作业的学生人数

题目描述

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

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

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

提示:

  • startTime.length==endTime.lengthstartTime.length == endTime.length
  • 1startTime.length1001 \leqslant startTime.length \leqslant 100
  • 1startTime[i]endTime[i]10001 \leqslant startTime[i] \leqslant endTime[i] \leqslant 1000
  • 1 queryTime10001 \leqslant queryTime \leqslant 1000

示例 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

整理题意

给定两个整数数组 startTimeendTime[startTime[i], endTime[i]] 分别表示第 i 个人的开始时间和结束时间(含),然后给定一个整数 queryTime,问有多少个人的开始和结束时间包含了 queryTime

解题思路分析

需要注意给定的数组并非有序数组,所以我们要么对数组进行排序,要么就要遍历完数组,由于对数组排序的时间为 O(nlogn)O(n \log n),我们选择直接遍历数组更优,直接判断 queryTime 是否处于 [startTime[i], endTime[i]] 之间即可。

具体实现

  • 同时遍历两个数组;
  • 当满足 startTime[i]queryTimeendTime[i]startTime[i] ≤ queryTime ≤ endTime[i] 时为符合条件的人,累加进答案即可;
  • 输出最后统计的人数。

复杂度分析

  • 时间复杂度:O(n)O(n),其中 n 为 数组的长度。只需遍历一遍数组即可。
  • 空间复杂度:O(1)O(1),仅需常数空间。

代码实现

class Solution {
public:
    int busyStudent(vector<int>& startTime, vector<int>& endTime, int queryTime) {
        int n = startTime.size();
        int ans = 0;
        for(int i = 0; i < n; i++){
            // 直接判断 queryTime 是否在当前 startTime 和 endTime 之间即可
            if(startTime[i] <= queryTime && endTime[i] >= queryTime) ans++;
        }
        return ans;
    }
};

总结

  • 该题还可以使用 差分数组二分查找 的方法进行解题,但复杂度方面都不如直接暴力好,但是我们需要知道其思想,也就是差分和二分的思想:
    • 利用差分数组的思想,对差分数组求前缀和,可以得到统计出 queryTime 时刻正在做作业的人数。
    • 二分查找的方法为先对开始时间和结束时间进行排序,通过二分查找找到始时间小于等于 queryTime 的学生人数,然后减去结束时间小于 queryTime 的学生人数,最终结果即为符合条件要求。
  • 测试结果:

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

结束语

斗志和干劲很重要,但更重要的是坚持下去的勇气。把最初为了梦想而有过的勇气,变成此时此刻的坚持,你终将遇见更好的自己。愿你不辜负每一道晨光,也不畏惧每一个骄阳,背起行囊,向着远方出发吧!新的一天,加油!