64
64
65
65
<!-- 这里可写通用的实现逻辑 -->
66
66
67
+ ** 方法一:遍历计数**
68
+
69
+ 同时遍历 $startTime$ 和 $endTime$,统计正在做作业的学生人数。
70
+
71
+ 时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 是 $startTime$ 和 $endTime$ 的长度。
72
+
73
+ ** 方法二:差分数组**
74
+
75
+ 差分数组可以 $O(1)$ 时间处理区间加减操作。例如,对区间 $[ l, r] $ 中的每个数加上 $c$。
76
+
77
+ 假设数组 $a$ 的所有元素分别为 $a[ 1] , a[ 2] , ... a[ n] $,则差分数组 $b$ 的元素 $b[ i] =a[ i] -a[ i-1] $。
78
+
79
+ $$
80
+ \begin{cases}
81
+ b[1]=a[1]\\
82
+ b[2]=a[2]-a[1]\\
83
+ b[3]=a[3]-a[2]\\
84
+ ...\\
85
+ b[i]=a[i]-a[i-1]\\
86
+ \end{cases}
87
+ $$
88
+
89
+ 那么 $a[ i] =b[ 1] +b[ 2] +...+b[ i] $,原数组 $a$ 是差分数组 $b$ 的前缀和。
90
+
91
+ 在这道题中,我们定义差分数组 $c$,然后遍历两个数组中对应位置的两个数 $a$, $b$,则 $c[ a] +=1$, $c[ b+1] -=1$。
92
+
93
+ 遍历结束后,对差分数组 $c$ 进行求前缀和操作,即可得到 $queryTime$ 时刻正在做作业的学生人数。
94
+
95
+ 时间复杂度 $O(n+queryTime)$,空间复杂度 $O(1010)$。
96
+
67
97
<!-- tabs:start -->
68
98
69
99
### ** Python3**
@@ -75,10 +105,17 @@ class Solution:
75
105
def busyStudent (
76
106
self , startTime : List[int ], endTime : List[int ], queryTime : int
77
107
) -> int :
78
- count, n = 0 , len (startTime)
79
- for i in range (n):
80
- count += startTime[i] <= queryTime <= endTime[i]
81
- return count
108
+ return sum (a <= queryTime <= b for a, b in zip (startTime, endTime))
109
+ ```
110
+
111
+ ``` python
112
+ class Solution :
113
+ def busyStudent (self , startTime : List[int ], endTime : List[int ], queryTime : int ) -> int :
114
+ c = [0 ] * 1010
115
+ for a, b in zip (startTime, endTime):
116
+ c[a] += 1
117
+ c[b + 1 ] -= 1
118
+ return sum (c[: queryTime + 1 ])
82
119
```
83
120
84
121
### ** Java**
@@ -88,13 +125,30 @@ class Solution:
88
125
``` java
89
126
class Solution {
90
127
public int busyStudent (int [] startTime , int [] endTime , int queryTime ) {
91
- int count = 0 , n = startTime . length ;
92
- for (int i = 0 ; i < n ; ++ i) {
128
+ int ans = 0 ;
129
+ for (int i = 0 ; i < startTime . length ; ++ i) {
93
130
if (startTime[i] <= queryTime && queryTime <= endTime[i]) {
94
- ++ count ;
131
+ ++ ans ;
95
132
}
96
133
}
97
- return count;
134
+ return ans;
135
+ }
136
+ }
137
+ ```
138
+
139
+ ``` java
140
+ class Solution {
141
+ public int busyStudent (int [] startTime , int [] endTime , int queryTime ) {
142
+ int [] c = new int [1010 ];
143
+ for (int i = 0 ; i < startTime. length; ++ i) {
144
+ c[startTime[i]]++ ;
145
+ c[endTime[i] + 1 ]-- ;
146
+ }
147
+ int ans = 0 ;
148
+ for (int i = 0 ; i <= queryTime; ++ i) {
149
+ ans += c[i];
150
+ }
151
+ return ans;
98
152
}
99
153
}
100
154
```
@@ -105,13 +159,29 @@ class Solution {
105
159
class Solution {
106
160
public:
107
161
int busyStudent(vector<int >& startTime, vector<int >& endTime, int queryTime) {
108
- int count = 0, n = startTime.size();
109
- for (int i = 0; i < n; ++i) {
110
- if (startTime[ i] <= queryTime && queryTime <= endTime[ i] ) {
111
- ++count;
112
- }
162
+ int ans = 0;
163
+ for (int i = 0; i < startTime.size(); ++i) {
164
+ ans += startTime[ i] <= queryTime && queryTime <= endTime[ i] ;
113
165
}
114
- return count;
166
+ return ans;
167
+ }
168
+ };
169
+ ```
170
+
171
+ ```cpp
172
+ class Solution {
173
+ public:
174
+ int busyStudent(vector<int>& startTime, vector<int>& endTime, int queryTime) {
175
+ vector<int> c(1010);
176
+ for (int i = 0; i < startTime.size(); ++i) {
177
+ c[startTime[i]]++;
178
+ c[endTime[i] + 1]--;
179
+ }
180
+ int ans = 0;
181
+ for (int i = 0; i <= queryTime; ++i) {
182
+ ans += c[i];
183
+ }
184
+ return ans;
115
185
}
116
186
};
117
187
```
@@ -120,13 +190,30 @@ public:
120
190
121
191
``` go
122
192
func busyStudent (startTime []int , endTime []int , queryTime int ) int {
123
- count, n := 0, len(startTime)
124
- for i := 0; i < n; i++ {
125
- if startTime[i] <= queryTime && queryTime <= endTime[i] {
126
- count++
193
+ ans := 0
194
+ for i , a := range startTime {
195
+ b := endTime[i]
196
+ if a <= queryTime && queryTime <= b {
197
+ ans++
127
198
}
128
199
}
129
- return count
200
+ return ans
201
+ }
202
+ ```
203
+
204
+ ``` go
205
+ func busyStudent (startTime []int , endTime []int , queryTime int ) int {
206
+ c := make ([]int , 1010 )
207
+ for i , a := range startTime {
208
+ b := endTime[i]
209
+ c[a]++
210
+ c[b+1 ]--
211
+ }
212
+ ans := 0
213
+ for i := 0 ; i <= queryTime; i++ {
214
+ ans += c[i]
215
+ }
216
+ return ans
130
217
}
131
218
```
132
219
0 commit comments