【每日一题记录】1450. 在既定时间做作业的学生人数

107 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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
};

image.png

二分查找

    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;
};