携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情
大家好 我是短袖撸码蒂尔尼。今天带来的是一道在LeetCode上的题目,题目难度为简单。就在此为大家分享一下解答思路。
题目阐述
给你两个整数数组 startTime(开始时间)和 endTime(结束时间),并指定一个整数 queryTime 作为查询时间。
已知,第 i 名学生在 startTime[i] 时开始写作业并于 endTime[i] 时完成作业。
请返回在查询时间 queryTime 时正在做作业的学生人数。形式上,返回能够使 queryTime 处于区间 [startTime[i], endTime[i]](含)的学生人数。
示例 2:
输入:startTime = [4], endTime = [4], queryTime = 4 输出:1 解释:在查询时间只有一名学生在做作业。 示例 3:
输入:startTime = [4], endTime = [4], queryTime = 5 输出:0
思路阐述
这个题目很简单,对于简单的题目,我感觉应该要追求一题多解。
| 解题思路 | 具体方法 |
|---|---|
| 遍历 | 直接比较endTime[i] >= queryTime&&startTime[i]<=queryTime |
| 二分查找 | 通过二分查找判断始时间小于等于 queryTime 的学生人数,然后减去结束时间小于 queryTime 的学生人数 |
遍历
function busyStudent(startTime: number[], endTime: number[], queryTime: number): number {
let sum = 0
for (let i = 0; i < startTime.length; i++) {
if (endTime[i] >= queryTime&&startTime[i]<=queryTime)
sum = sum + 1
}
return sum
};
二分查找
var busyStudent = function(startTime, endTime, queryTime) {
startTime.sort((a, b) => a - b);
endTime.sort((a, b) => a - b);
const lessStart = upperbound(startTime, 0, startTime.length - 1, queryTime);
const lessEnd = lowerbound(endTime, 0, endTime.length - 1, queryTime);
return lessStart - lessEnd;
}
const upperbound = (arr, l, r, target) => {
let ans = r + 1;
while (l <= r) {
const mid = l + ((r - l) >> 1);
if (arr[mid] > target) {
ans = mid;
r = mid - 1;
} else {
l = mid + 1;
}
}
return ans;
}
const lowerbound = (arr, l, r, target) => {
let ans = r + 1;
while (l <= r) {
let mid = l + ((r - l) >> 1);
if (arr[mid] >= target) {
ans = mid;
r = mid - 1;
} else {
l = mid + 1;
}
}
return ans;
};