Skip to content

Files

Latest commit

fa73a73 · Jan 16, 2024

History

History

1450.Number of Students Doing Homework at a Given Time

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Jan 16, 2024
Jan 16, 2024
Jan 13, 2024
Aug 18, 2022
Aug 18, 2022
Aug 18, 2022
Aug 18, 2022
Aug 18, 2022
Aug 31, 2023
Jan 13, 2024
Jan 13, 2024
Jan 13, 2024
Jan 13, 2024

English Version

题目描述

给你两个整数数组 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.length == endTime.length
  • 1 <= startTime.length <= 100
  • 1 <= startTime[i] <= endTime[i] <= 1000
  • 1 <= queryTime <= 1000

解法

方法一:遍历计数

同时遍历 s t a r t T i m e e n d T i m e ,统计正在做作业的学生人数。

时间复杂度 O ( n ) ,空间复杂度 O ( 1 ) 。其中 n s t a r t T i m e e n d T i m e 的长度。

class Solution:
    def busyStudent(
        self, startTime: List[int], endTime: List[int], queryTime: int
    ) -> int:
        return sum(a <= queryTime <= b for a, b in zip(startTime, endTime))
class Solution {
    public int busyStudent(int[] startTime, int[] endTime, int queryTime) {
        int ans = 0;
        for (int i = 0; i < startTime.length; ++i) {
            if (startTime[i] <= queryTime && queryTime <= endTime[i]) {
                ++ans;
            }
        }
        return ans;
    }
}
class Solution {
public:
    int busyStudent(vector<int>& startTime, vector<int>& endTime, int queryTime) {
        int ans = 0;
        for (int i = 0; i < startTime.size(); ++i) {
            ans += startTime[i] <= queryTime && queryTime <= endTime[i];
        }
        return ans;
    }
};
func busyStudent(startTime []int, endTime []int, queryTime int) int {
	ans := 0
	for i, a := range startTime {
		b := endTime[i]
		if a <= queryTime && queryTime <= b {
			ans++
		}
	}
	return ans
}
function busyStudent(startTime: number[], endTime: number[], queryTime: number): number {
    const n = startTime.length;
    let res = 0;
    for (let i = 0; i < n; i++) {
        if (startTime[i] <= queryTime && endTime[i] >= queryTime) {
            res++;
        }
    }
    return res;
}
impl Solution {
    pub fn busy_student(start_time: Vec<i32>, end_time: Vec<i32>, query_time: i32) -> i32 {
        let mut res = 0;
        for i in 0..start_time.len() {
            if start_time[i] <= query_time && end_time[i] >= query_time {
                res += 1;
            }
        }
        res
    }
}
int busyStudent(int* startTime, int startTimeSize, int* endTime, int endTimeSize, int queryTime) {
    int res = 0;
    for (int i = 0; i < startTimeSize; i++) {
        if (startTime[i] <= queryTime && endTime[i] >= queryTime) {
            res++;
        }
    }
    return res;
}

方法二:差分数组

差分数组可以 O ( 1 ) 时间处理区间加减操作。例如,对区间 [ l , r ] 中的每个数加上 c

假设数组 a 的所有元素分别为 a [ 1 ] , a [ 2 ] , . . . a [ n ] ,则差分数组 b 的元素 b [ i ] = a [ i ] a [ i 1 ]

{ b [ 1 ] = a [ 1 ] b [ 2 ] = a [ 2 ] a [ 1 ] b [ 3 ] = a [ 3 ] a [ 2 ] . . . b [ i ] = a [ i ] a [ i 1 ]

那么 a [ i ] = b [ 1 ] + b [ 2 ] + . . . + b [ i ] ,原数组 a 是差分数组 b 的前缀和。

在这道题中,我们定义差分数组 c ,然后遍历两个数组中对应位置的两个数 a , b ,则 c [ a ] + = 1 , c [ b + 1 ] = 1

遍历结束后,对差分数组 c 进行求前缀和操作,即可得到 q u e r y T i m e 时刻正在做作业的学生人数。

时间复杂度 O ( n + q u e r y T i m e ) ,空间复杂度 O ( 1010 )

class Solution:
    def busyStudent(
        self, startTime: List[int], endTime: List[int], queryTime: int
    ) -> int:
        c = [0] * 1010
        for a, b in zip(startTime, endTime):
            c[a] += 1
            c[b + 1] -= 1
        return sum(c[: queryTime + 1])
class Solution {
    public int busyStudent(int[] startTime, int[] endTime, int queryTime) {
        int[] c = new int[1010];
        for (int i = 0; i < startTime.length; ++i) {
            c[startTime[i]]++;
            c[endTime[i] + 1]--;
        }
        int ans = 0;
        for (int i = 0; i <= queryTime; ++i) {
            ans += c[i];
        }
        return ans;
    }
}
class Solution {
public:
    int busyStudent(vector<int>& startTime, vector<int>& endTime, int queryTime) {
        vector<int> c(1010);
        for (int i = 0; i < startTime.size(); ++i) {
            c[startTime[i]]++;
            c[endTime[i] + 1]--;
        }
        int ans = 0;
        for (int i = 0; i <= queryTime; ++i) {
            ans += c[i];
        }
        return ans;
    }
};
func busyStudent(startTime []int, endTime []int, queryTime int) int {
	c := make([]int, 1010)
	for i, a := range startTime {
		b := endTime[i]
		c[a]++
		c[b+1]--
	}
	ans := 0
	for i := 0; i <= queryTime; i++ {
		ans += c[i]
	}
	return ans
}