持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情
题目链接:1450. 在既定时间做作业的学生人数
题目描述
给你两个整数数组 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 和 endTime,[startTime[i], endTime[i]] 分别表示第 i 个人的开始时间和结束时间(含),然后给定一个整数 queryTime,问有多少个人的开始和结束时间包含了 queryTime 。
解题思路分析
需要注意给定的数组并非有序数组,所以我们要么对数组进行排序,要么就要遍历完数组,由于对数组排序的时间为 ,我们选择直接遍历数组更优,直接判断 queryTime 是否处于 [startTime[i], endTime[i]] 之间即可。
具体实现
- 同时遍历两个数组;
- 当满足 时为符合条件的人,累加进答案即可;
- 输出最后统计的人数。
复杂度分析
- 时间复杂度:,其中
n为 数组的长度。只需遍历一遍数组即可。 - 空间复杂度:,仅需常数空间。
代码实现
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的学生人数,最终结果即为符合条件要求。
- 利用差分数组的思想,对差分数组求前缀和,可以得到统计出
- 测试结果:
结束语
斗志和干劲很重要,但更重要的是坚持下去的勇气。把最初为了梦想而有过的勇气,变成此时此刻的坚持,你终将遇见更好的自己。愿你不辜负每一道晨光,也不畏惧每一个骄阳,背起行囊,向着远方出发吧!新的一天,加油!