算法小知识-----8.19-----在既定时间做作业的学生人数

110 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情

快乐周五~~ 全员起飞,但是还需要持续努力去做题

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

该题出自力扣的1450题 —— 在既定时间做作业的学生人数【简单题】,确实简单

审题

给你两个整数数组 startTime(开始时间)和 endTime(结束时间),并指定一个整数 queryTime 作为查询时间。
已知,第 i 名学生在 startTime[i] 时开始写作业并于 endTime[i] 时完成作业。
请返回在查询时间 queryTime 时正在做作业的学生人数。形式上,返回能够使 queryTime 处于区间 [startTime[i], endTime[i]](含)的学生人数。

  • 该题很简单,给出两个整型数组,和一个指定整型,要求找出区间在这个指定整型内的个数
  • 解法很多,这边先用最简单淳朴的解法
    • 定义一个变量,存储个数,初始值为0
    • 因为两个数组的长度一致,所以遍历数组
      • 判断指定变量是否存在于两个数组之间
  • 差分解法:
    • 利用数组的差分概念 + 查分数组的前缀和,统计出指定时间内的学生个数
    • 初步做一个剪枝,找出结束数组的最大值,如果指定变量 大于 最大值,那么可以直接返回0
    • 定义差分数组,利用两个数组的时间,起始时间 加1,结束时间下标 + 1,值 减一;最终形成 1 + (-1) = 0
    • 最后再次遍历,利用前缀和统计出有多少个学生

编码

class Solution {
    public int busyStudent(int[] startTime, int[] endTime, int queryTime) {
        int sum = 0;
        for (int i = 0; i < startTime.length; i++) {
            if (startTime[i] <= queryTime && queryTime <= endTime[i]){
                sum++;
            }
        }
        return sum;
    }
}

image.png

class Solution {
    public int busyStudent(int[] startTime, int[] endTime, int queryTime) {
        int n = startTime.length;
        int max = Arrays.stream(endTime).max().getAsInt();
        if (queryTime > max){
            return 0;
        }
        int[] cnt = new int[max + 2];
        int sum = 0;
        for (int i = 0; i < n; i++) {
            cnt[startTime[i]]++;
            cnt[endTime[i] + 1]--;
        }
        for (int i = 0;i<=queryTime;i++){
            sum+=cnt[i];
        }
        return sum;
    }
}

image.png