@@ -167,4 +167,156 @@ function relativeSortArray(arr1: number[], arr2: number[]): number[] {
167
167
168
168
<!-- solution: end -->
169
169
170
+ <!-- solution: start -->
171
+
172
+ ### Solution 2: Counting Sort
173
+
174
+ We can use the idea of counting sort. First, count the occurrence of each element in array $arr1$. Then, according to the order in array $arr2$, put the elements in $arr1$ into the answer array $ans$ according to their occurrence. Finally, we traverse all elements in $arr1$ and put the elements that do not appear in $arr2$ in ascending order at the end of the answer array $ans$.
175
+
176
+ The time complexity is $O(n + m)$, and the space complexity is $O(n)$. Where $n$ and $m$ are the lengths of arrays $arr1$ and $arr2$ respectively.
177
+
178
+ <!-- solution: start -->
179
+
180
+ #### Python3
181
+
182
+ ``` python
183
+ class Solution :
184
+ def relativeSortArray (self , arr1 : List[int ], arr2 : List[int ]) -> List[int ]:
185
+ cnt = Counter(arr1)
186
+ ans = []
187
+ for x in arr2:
188
+ ans.extend([x] * cnt[x])
189
+ cnt.pop(x)
190
+ mi, mx = min (arr1), max (arr1)
191
+ for x in range (mi, mx + 1 ):
192
+ ans.extend([x] * cnt[x])
193
+ return ans
194
+ ```
195
+
196
+ #### Java
197
+
198
+ ``` java
199
+ class Solution {
200
+ public int [] relativeSortArray (int [] arr1 , int [] arr2 ) {
201
+ int [] cnt = new int [1001 ];
202
+ int mi = 1001 , mx = 0 ;
203
+ for (int x : arr1) {
204
+ ++ cnt[x];
205
+ mi = Math . min(mi, x);
206
+ mx = Math . max(mx, x);
207
+ }
208
+ int m = arr1. length;
209
+ int [] ans = new int [m];
210
+ int i = 0 ;
211
+ for (int x : arr2) {
212
+ while (cnt[x] > 0 ) {
213
+ -- cnt[x];
214
+ ans[i++ ] = x;
215
+ }
216
+ }
217
+ for (int x = mi; x <= mx; ++ x) {
218
+ while (cnt[x] > 0 ) {
219
+ -- cnt[x];
220
+ ans[i++ ] = x;
221
+ }
222
+ }
223
+ return ans;
224
+ }
225
+ }
226
+ ```
227
+
228
+ #### C++
229
+
230
+ ``` cpp
231
+ class Solution {
232
+ public:
233
+ vector<int > relativeSortArray(vector<int >& arr1, vector<int >& arr2) {
234
+ vector<int > cnt(1001);
235
+ for (int x : arr1) {
236
+ ++cnt[ x] ;
237
+ }
238
+ auto [ mi, mx] = minmax_element(arr1.begin(), arr1.end());
239
+ vector<int > ans;
240
+ for (int x : arr2) {
241
+ while (cnt[ x] ) {
242
+ ans.push_back(x);
243
+ --cnt[ x] ;
244
+ }
245
+ }
246
+ for (int x = * mi; x <= * mx; ++x) {
247
+ while (cnt[ x] ) {
248
+ ans.push_back(x);
249
+ --cnt[ x] ;
250
+ }
251
+ }
252
+ return ans;
253
+ }
254
+ };
255
+ ```
256
+
257
+ #### Go
258
+
259
+ ```go
260
+ func relativeSortArray(arr1 []int, arr2 []int) []int {
261
+ cnt := make([]int, 1001)
262
+ mi, mx := 1001, 0
263
+ for _, x := range arr1 {
264
+ cnt[x]++
265
+ mi = min(mi, x)
266
+ mx = max(mx, x)
267
+ }
268
+ ans := make([]int, 0, len(arr1))
269
+ for _, x := range arr2 {
270
+ for cnt[x] > 0 {
271
+ ans = append(ans, x)
272
+ cnt[x]--
273
+ }
274
+ }
275
+ for x := mi; x <= mx; x++ {
276
+ for cnt[x] > 0 {
277
+ ans = append(ans, x)
278
+ cnt[x]--
279
+ }
280
+ }
281
+ return ans
282
+ }
283
+ ```
284
+
285
+ #### TypeScript
286
+
287
+ ``` ts
288
+ function relativeSortArray(arr1 : number [], arr2 : number []): number [] {
289
+ const cnt = Array (1001 ).fill (0 );
290
+ let mi = Number .POSITIVE_INFINITY;
291
+ let mx = Number .NEGATIVE_INFINITY;
292
+
293
+ for (const x of arr1 ) {
294
+ cnt [x ]++ ;
295
+ mi = Math .min (mi , x );
296
+ mx = Math .max (mx , x );
297
+ }
298
+
299
+ const ans: number [] = [];
300
+ for (const x of arr2 ) {
301
+ while (cnt [x ]) {
302
+ cnt [x ]-- ;
303
+ ans .push (x );
304
+ }
305
+ }
306
+
307
+ for (let i = mi ; i <= mx ; i ++ ) {
308
+ while (cnt [i ]) {
309
+ cnt [i ]-- ;
310
+ ans .push (i );
311
+ }
312
+ }
313
+
314
+ return ans ;
315
+ }
316
+ ```
317
+
318
+ <!-- tabs: end -->
319
+
320
+ <!-- solution: end -->
321
+
170
322
<!-- problem: end -->
0 commit comments