60
60
61
61
### 方法一:差分数组
62
62
63
- 我们创建一个长度为 $110$ 的差分数组 $d$,然后遍历给定的数组,对于每个区间 $[ a, b ] $,我们令 $d [ a ] $ 增加 $1$,$d [ b + 1 ] $ 减少 $1$。最后我们遍历差分数组 $d$,求每个位置的前缀和 $s$,如果 $s > 0$,则说明该位置被覆盖,我们将答案增加 $1$ 。
63
+ 根据题目描述,我们需要给每个区间 $[ \textit{start} _ i, \textit{end} _ i ] $ 增加一个车辆,我们可以使用差分数组来实现 。
64
64
65
- 时间复杂度 $O(n)$,空间复杂度 $O(M)$。其中 $n$ 是给定数组的长度,而 $M$ 是数组中元素的最大值。
65
+ 我们定义一个长度为 $102$ 的数组 $d$,对于每个区间 $[ \textit{start}_ i, \textit{end}_ i] $,我们将 $d[ \textit{start}_ i] $ 加 $1$,将 $d[ \textit{end}_ i + 1] $ 减 $1$。
66
+
67
+ 最后,我们对 $d$ 进行前缀和运算,统计前缀和大于 $0$ 的个数即可。
68
+
69
+ 时间复杂度 $O(n + m)$,空间复杂度 $O(m)$,其中 $n$ 是给定数组的长度,而 $m$ 是数组中的最大值,本题中 $m \leq 102$。
66
70
67
71
<!-- tabs:start -->
68
72
@@ -71,10 +75,11 @@ tags:
71
75
``` python
72
76
class Solution :
73
77
def numberOfPoints (self , nums : List[List[int ]]) -> int :
74
- d = [0 ] * 110
75
- for a, b in nums:
76
- d[a] += 1
77
- d[b + 1 ] -= 1
78
+ m = 102
79
+ d = [0 ] * m
80
+ for start, end in nums:
81
+ d[start] += 1
82
+ d[end + 1 ] -= 1
78
83
return sum (s > 0 for s in accumulate(d))
79
84
```
80
85
@@ -83,16 +88,17 @@ class Solution:
83
88
``` java
84
89
class Solution {
85
90
public int numberOfPoints (List<List<Integer > > nums ) {
86
- int [] d = new int [110 ];
91
+ int [] d = new int [102 ];
87
92
for (var e : nums) {
88
- d[e. get(0 )]++ ;
89
- d[e. get(1 ) + 1 ]-- ;
93
+ int start = e. get(0 ), end = e. get(1 );
94
+ ++ d[start];
95
+ -- d[end + 1 ];
90
96
}
91
97
int ans = 0 , s = 0 ;
92
98
for (int x : d) {
93
99
s += x;
94
100
if (s > 0 ) {
95
- ans ++ ;
101
+ ++ ans ;
96
102
}
97
103
}
98
104
return ans;
@@ -106,10 +112,11 @@ class Solution {
106
112
class Solution {
107
113
public:
108
114
int numberOfPoints(vector<vector<int >>& nums) {
109
- int d[ 110] {};
110
- for (auto& e : nums) {
111
- d[ e[ 0]] ++;
112
- d[ e[ 1] + 1] --;
115
+ int d[ 102] {};
116
+ for (const auto& e : nums) {
117
+ int start = e[ 0] , end = e[ 1] ;
118
+ ++d[ start] ;
119
+ --d[ end + 1] ;
113
120
}
114
121
int ans = 0, s = 0;
115
122
for (int x : d) {
@@ -125,10 +132,11 @@ public:
125
132
126
133
```go
127
134
func numberOfPoints(nums [][]int) (ans int) {
128
- d := [110 ]int{}
135
+ d := [102 ]int{}
129
136
for _, e := range nums {
130
- d[e[0]]++
131
- d[e[1]+1]--
137
+ start, end := e[0], e[1]
138
+ d[start]++
139
+ d[end+1]--
132
140
}
133
141
s := 0
134
142
for _, x := range d {
@@ -145,18 +153,147 @@ func numberOfPoints(nums [][]int) (ans int) {
145
153
146
154
``` ts
147
155
function numberOfPoints(nums : number [][]): number {
148
- const d: number [] = Array (110 ).fill (0 );
149
- for (const [a, b ] of nums ) {
150
- d [ a ] ++ ;
151
- d [ b + 1 ]-- ;
156
+ const d: number [] = Array (102 ).fill (0 );
157
+ for (const [start, end ] of nums ) {
158
+ ++ d [ start ] ;
159
+ -- d [ end + 1 ];
152
160
}
153
161
let ans = 0 ;
154
162
let s = 0 ;
155
163
for (const x of d ) {
156
164
s += x ;
165
+ ans += s > 0 ? 1 : 0 ;
166
+ }
167
+ return ans ;
168
+ }
169
+ ```
170
+
171
+ <!-- tabs: end -->
172
+
173
+ <!-- solution: end -->
174
+
175
+ <!-- solution: start -->
176
+
177
+ ### 方法二:哈希表 + 差分 + 排序
178
+
179
+ 如果题目的区间范围较大,我们可以使用哈希表来存储区间的起点和终点,然后对哈希表的键进行排序,再进行前缀和统计。
180
+
181
+ 时间复杂度 $O(n \times \log n)$,空间复杂度 $O(n)$。其中 $n$ 为给定数组的长度。
182
+
183
+ <!-- tabs: start -->
184
+
185
+ #### Python3
186
+
187
+ ``` python
188
+ class Solution :
189
+ def numberOfPoints (self , nums : List[List[int ]]) -> int :
190
+ d = defaultdict(int )
191
+ for start, end in nums:
192
+ d[start] += 1
193
+ d[end + 1 ] -= 1
194
+ ans = s = last = 0
195
+ for cur, v in sorted (d.items()):
196
+ if s > 0 :
197
+ ans += cur - last
198
+ s += v
199
+ last = cur
200
+ return ans
201
+ ```
202
+
203
+ #### Java
204
+
205
+ ``` java
206
+ class Solution {
207
+ public int numberOfPoints (List<List<Integer > > nums ) {
208
+ TreeMap<Integer , Integer > d = new TreeMap<> ();
209
+ for (var e : nums) {
210
+ int start = e. get(0 ), end = e. get(1 );
211
+ d. merge(start, 1 , Integer :: sum);
212
+ d. merge(end + 1 , - 1 , Integer :: sum);
213
+ }
214
+ int ans = 0 , s = 0 , last = 0 ;
215
+ for (var e : d. entrySet()) {
216
+ int cur = e. getKey(), v = e. getValue();
217
+ if (s > 0 ) {
218
+ ans += cur - last;
219
+ }
220
+ s += v;
221
+ last = cur;
222
+ }
223
+ return ans;
224
+ }
225
+ }
226
+ ```
227
+
228
+ #### C++
229
+
230
+ ``` cpp
231
+ class Solution {
232
+ public:
233
+ int numberOfPoints(vector<vector<int >>& nums) {
234
+ map<int, int> d;
235
+ for (const auto& e : nums) {
236
+ int start = e[ 0] , end = e[ 1] ;
237
+ ++d[ start] ;
238
+ --d[ end + 1] ;
239
+ }
240
+ int ans = 0, s = 0, last = 0;
241
+ for (const auto& [ cur, v] : d) {
242
+ if (s > 0) {
243
+ ans += cur - last;
244
+ }
245
+ s += v;
246
+ last = cur;
247
+ }
248
+ return ans;
249
+ }
250
+ };
251
+ ```
252
+
253
+ #### Go
254
+
255
+ ```go
256
+ func numberOfPoints(nums [][]int) (ans int) {
257
+ d := map[int]int{}
258
+ for _, e := range nums {
259
+ start, end := e[0], e[1]
260
+ d[start]++
261
+ d[end+1]--
262
+ }
263
+ keys := []int{}
264
+ for k := range d {
265
+ keys = append(keys, k)
266
+ }
267
+ s, last := 0, 0
268
+ sort.Ints(keys)
269
+ for _, cur := range keys {
270
+ if s > 0 {
271
+ ans += cur - last
272
+ }
273
+ s += d[cur]
274
+ last = cur
275
+ }
276
+ return
277
+ }
278
+ ```
279
+
280
+ #### TypeScript
281
+
282
+ ``` ts
283
+ function numberOfPoints(nums : number [][]): number {
284
+ const d = new Map <number , number >();
285
+ for (const [start, end] of nums ) {
286
+ d .set (start , (d .get (start ) || 0 ) + 1 );
287
+ d .set (end + 1 , (d .get (end + 1 ) || 0 ) - 1 );
288
+ }
289
+ const keys = [... d .keys ()].sort ((a , b ) => a - b );
290
+ let [ans, s, last] = [0 , 0 , 0 ];
291
+ for (const cur of keys ) {
157
292
if (s > 0 ) {
158
- ans ++ ;
293
+ ans += cur - last ;
159
294
}
295
+ s += d .get (cur )! ;
296
+ last = cur ;
160
297
}
161
298
return ans ;
162
299
}
0 commit comments