@@ -50,7 +50,11 @@ edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%2
50
50
51
51
<!-- solution:start -->
52
52
53
- ### 方法一
53
+ ### 方法一:自定义排序
54
+
55
+ 我们先用哈希表 $pos$ 记录数组 $arr2$ 中每个元素的位置。然后,我们将数组 $arr1$ 中的每个元素映射成一个二元组 $(pos.get(x, 1000 + x), x)$,并对二元组进行排序。最后我们取出所有二元组的第二个元素并返回即可。
56
+
57
+ 时间复杂度 $O(n \times \log n + m)$,空间复杂度 $O(n + m)$。其中 $n$ 和 $m$ 分别是数组 $arr1$ 和 $arr2$ 的长度。
54
58
55
59
<!-- tabs:start -->
56
60
@@ -59,30 +63,26 @@ edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%2
59
63
``` python
60
64
class Solution :
61
65
def relativeSortArray (self , arr1 : List[int ], arr2 : List[int ]) -> List[int ]:
62
- mp = {num: i for i, num in enumerate (arr2)}
63
- arr1.sort(key = lambda x : (mp.get(x, 10000 ), x))
64
- return arr1
66
+ pos = {x: i for i, x in enumerate (arr2)}
67
+ return sorted (arr1, key = lambda x : pos.get(x, 1000 + x))
65
68
```
66
69
67
70
#### Java
68
71
69
72
``` java
70
73
class Solution {
71
74
public int [] relativeSortArray (int [] arr1 , int [] arr2 ) {
72
- int [] mp = new int [ 1001 ] ;
73
- for (int x : arr1 ) {
74
- ++ mp[x] ;
75
+ Map< Integer , Integer > pos = new HashMap<> (arr2 . length) ;
76
+ for (int i = 0 ; i < arr2 . length; ++ i ) {
77
+ pos . put(arr2[i], i) ;
75
78
}
76
- int i = 0 ;
77
- for (int x : arr2) {
78
- while (mp[x]-- > 0 ) {
79
- arr1[i++ ] = x;
80
- }
79
+ int [][] arr = new int [arr1. length][0 ];
80
+ for (int i = 0 ; i < arr. length; ++ i) {
81
+ arr[i] = new int [] {arr1[i], pos. getOrDefault(arr1[i], arr2. length + arr1[i])};
81
82
}
82
- for (int j = 0 ; j < mp. length; ++ j) {
83
- while (mp[j]-- > 0 ) {
84
- arr1[i++ ] = j;
85
- }
83
+ Arrays . sort(arr, (a, b) - > a[1 ] - b[1 ]);
84
+ for (int i = 0 ; i < arr. length; ++ i) {
85
+ arr1[i] = arr[i][0 ];
86
86
}
87
87
return arr1;
88
88
}
@@ -95,14 +95,18 @@ class Solution {
95
95
class Solution {
96
96
public:
97
97
vector<int > relativeSortArray(vector<int >& arr1, vector<int >& arr2) {
98
- vector<int > mp(1001);
99
- for (int x : arr1) ++mp[ x] ;
100
- int i = 0;
101
- for (int x : arr2) {
102
- while (mp[ x] -- > 0) arr1[ i++] = x;
98
+ unordered_map<int, int> pos;
99
+ for (int i = 0; i < arr2.size(); ++i) {
100
+ pos[ arr2[ i]] = i;
101
+ }
102
+ vector<pair<int, int>> arr;
103
+ for (int i = 0; i < arr1.size(); ++i) {
104
+ int j = pos.count(arr1[ i] ) ? pos[ arr1[ i]] : arr2.size();
105
+ arr.emplace_back(j, arr1[ i] );
103
106
}
104
- for (int j = 0; j < mp.size(); ++j) {
105
- while (mp[ j] -- > 0) arr1[ i++] = j;
107
+ sort(arr.begin(), arr.end());
108
+ for (int i = 0; i < arr1.size(); ++i) {
109
+ arr1[ i] = arr[ i] .second;
106
110
}
107
111
return arr1;
108
112
}
@@ -113,90 +117,250 @@ public:
113
117
114
118
```go
115
119
func relativeSortArray(arr1 []int, arr2 []int) []int {
116
- mp := make([ ]int, 1001)
117
- for _ , x := range arr1 {
118
- mp [x]++
120
+ pos := map[int ]int{}
121
+ for i , x := range arr2 {
122
+ pos [x] = i
119
123
}
120
- i := 0
121
- for _ , x := range arr2 {
122
- for mp [x] > 0 {
123
- arr1 [i] = x
124
- mp[x]--
125
- i++
124
+ arr := make([][2]int, len(arr1))
125
+ for i , x := range arr1 {
126
+ if p, ok := pos [x]; ok {
127
+ arr [i] = [2]int{p, x}
128
+ } else {
129
+ arr[i] = [2]int{len(arr2), x}
126
130
}
127
131
}
128
- for j, cnt := range mp {
129
- for cnt > 0 {
130
- arr1[i] = j
131
- i++
132
- cnt--
133
- }
132
+ sort.Slice(arr, func(i, j int) bool {
133
+ return arr[i][0] < arr[j][0] || arr[i][0] == arr[j][0] && arr[i][1] < arr[j][1]
134
+ })
135
+ for i, x := range arr {
136
+ arr1[i] = x[1]
134
137
}
135
138
return arr1
136
139
}
137
140
```
138
141
142
+ #### TypeScript
143
+
144
+ ``` ts
145
+ function relativeSortArray(arr1 : number [], arr2 : number []): number [] {
146
+ const pos: Map <number , number > = new Map ();
147
+ for (let i = 0 ; i < arr2 .length ; ++ i ) {
148
+ pos .set (arr2 [i ], i );
149
+ }
150
+ const arr: number [][] = [];
151
+ for (const x of arr1 ) {
152
+ const j = pos .get (x ) ?? arr2 .length ;
153
+ arr .push ([j , x ]);
154
+ }
155
+ arr .sort ((a , b ) => a [0 ] - b [0 ] || a [1 ] - b [1 ]);
156
+ return arr .map (a => a [1 ]);
157
+ }
158
+ ```
159
+
160
+ #### Swift
161
+
162
+ ``` swift
163
+ class Solution {
164
+ func relativeSortArray (_ arr1 : [Int ], _ arr2 : [Int ]) -> [Int ] {
165
+ var pos = [Int : Int ]()
166
+ for (i, x) in arr2.enumerated () {
167
+ pos[x] = i
168
+ }
169
+ var arr = [(Int , Int )]()
170
+ for x in arr1 {
171
+ let j = pos[x] ?? arr2.count
172
+ arr.append ((j, x))
173
+ }
174
+ arr.sort { $0 .0 < $1 .0 || ($0 .0 == $1 .0 && $0 .1 < $1 .1) }
175
+ return arr.map { $0 .1 }
176
+ }
177
+ }
178
+ ```
179
+
139
180
<!-- tabs: end -->
140
181
141
182
<!-- solution: end -->
142
183
143
- <!-- solution: start-- >
184
+ <!-- solution: start -->
144
185
145
- ### 方法二
186
+ ### 方法二:计数排序
146
187
147
- <!-- tabs: start -->
188
+ 我们可以使用计数排序的思想,首先统计数组 $arr1$ 中每个元素的出现次数,然后按照数组 $arr2$ 中的顺序,将 $arr1$ 中的元素按照出现次数放入答案数组 $ans$ 中。最后,我们遍历 $arr1$ 中的所有元素,将未在 $arr2$ 中出现的元素按照升序放入答案数组 $ans$ 的末尾。
189
+
190
+ 时间复杂度 $O(n + m)$,空间复杂度 $O(n)$。其中 $n$ 和 $m$ 分别是数组 $arr1$ 和 $arr2$ 的长度。
191
+
192
+ <!-- solution: start -->
148
193
149
194
#### Python3
150
195
151
196
``` python
152
197
class Solution :
153
198
def relativeSortArray (self , arr1 : List[int ], arr2 : List[int ]) -> List[int ]:
154
- mp = [0 ] * 1001
155
- for x in arr1:
156
- mp[x] += 1
157
- i = 0
199
+ cnt = Counter(arr1)
200
+ ans = []
158
201
for x in arr2:
159
- while mp[x] > 0 :
160
- arr1[i] = x
161
- mp[x] -= 1
162
- i += 1
163
- for x, cnt in enumerate (mp):
164
- for _ in range (cnt):
165
- arr1[i] = x
166
- i += 1
167
- return arr1
202
+ ans.extend([x] * cnt[x])
203
+ cnt.pop(x)
204
+ mi, mx = min (arr1), max (arr1)
205
+ for x in range (mi, mx + 1 ):
206
+ ans.extend([x] * cnt[x])
207
+ return ans
208
+ ```
209
+
210
+ #### Java
211
+
212
+ ``` java
213
+ class Solution {
214
+ public int [] relativeSortArray (int [] arr1 , int [] arr2 ) {
215
+ int [] cnt = new int [1001 ];
216
+ int mi = 1001 , mx = 0 ;
217
+ for (int x : arr1) {
218
+ ++ cnt[x];
219
+ mi = Math . min(mi, x);
220
+ mx = Math . max(mx, x);
221
+ }
222
+ int m = arr1. length;
223
+ int [] ans = new int [m];
224
+ int i = 0 ;
225
+ for (int x : arr2) {
226
+ while (cnt[x] > 0 ) {
227
+ -- cnt[x];
228
+ ans[i++ ] = x;
229
+ }
230
+ }
231
+ for (int x = mi; x <= mx; ++ x) {
232
+ while (cnt[x] > 0 ) {
233
+ -- cnt[x];
234
+ ans[i++ ] = x;
235
+ }
236
+ }
237
+ return ans;
238
+ }
239
+ }
240
+ ```
241
+
242
+ #### C++
243
+
244
+ ``` cpp
245
+ class Solution {
246
+ public:
247
+ vector<int > relativeSortArray(vector<int >& arr1, vector<int >& arr2) {
248
+ vector<int > cnt(1001);
249
+ for (int x : arr1) {
250
+ ++cnt[ x] ;
251
+ }
252
+ auto [ mi, mx] = minmax_element(arr1.begin(), arr1.end());
253
+ vector<int > ans;
254
+ for (int x : arr2) {
255
+ while (cnt[ x] ) {
256
+ ans.push_back(x);
257
+ --cnt[ x] ;
258
+ }
259
+ }
260
+ for (int x = * mi; x <= * mx; ++x) {
261
+ while (cnt[ x] ) {
262
+ ans.push_back(x);
263
+ --cnt[ x] ;
264
+ }
265
+ }
266
+ return ans;
267
+ }
268
+ };
269
+ ```
270
+
271
+ #### Go
272
+
273
+ ```go
274
+ func relativeSortArray(arr1 []int, arr2 []int) []int {
275
+ cnt := make([]int, 1001)
276
+ mi, mx := 1001, 0
277
+ for _, x := range arr1 {
278
+ cnt[x]++
279
+ mi = min(mi, x)
280
+ mx = max(mx, x)
281
+ }
282
+ ans := make([]int, 0, len(arr1))
283
+ for _, x := range arr2 {
284
+ for cnt[x] > 0 {
285
+ ans = append(ans, x)
286
+ cnt[x]--
287
+ }
288
+ }
289
+ for x := mi; x <= mx; x++ {
290
+ for cnt[x] > 0 {
291
+ ans = append(ans, x)
292
+ cnt[x]--
293
+ }
294
+ }
295
+ return ans
296
+ }
297
+ ```
298
+
299
+ #### TypeScript
300
+
301
+ ``` ts
302
+ function relativeSortArray(arr1 : number [], arr2 : number []): number [] {
303
+ const cnt = Array (1001 ).fill (0 );
304
+ let mi = Number .POSITIVE_INFINITY;
305
+ let mx = Number .NEGATIVE_INFINITY;
306
+
307
+ for (const x of arr1 ) {
308
+ cnt [x ]++ ;
309
+ mi = Math .min (mi , x );
310
+ mx = Math .max (mx , x );
311
+ }
312
+
313
+ const ans: number [] = [];
314
+ for (const x of arr2 ) {
315
+ while (cnt [x ]) {
316
+ cnt [x ]-- ;
317
+ ans .push (x );
318
+ }
319
+ }
320
+
321
+ for (let i = mi ; i <= mx ; i ++ ) {
322
+ while (cnt [i ]) {
323
+ cnt [i ]-- ;
324
+ ans .push (i );
325
+ }
326
+ }
327
+
328
+ return ans ;
329
+ }
168
330
```
169
331
170
332
#### Swift
171
333
172
334
``` swift
173
335
class Solution {
174
336
func relativeSortArray (_ arr1 : [Int ], _ arr2 : [Int ]) -> [Int ] {
175
- var frequency = [Int ](repeating : 0 , count : 1001 )
176
- var result = [Int ]()
177
-
178
- for num in arr1 {
179
- frequency[num] += 1
180
- }
181
-
182
- for num in arr2 {
183
- while frequency[num] > 0 {
184
- result.append (num)
185
- frequency[num] -= 1
337
+ var cnt = [Int ](repeating : 0 , count : 1001 )
338
+ for x in arr1 {
339
+ cnt[x] += 1
340
+ }
341
+
342
+ guard let mi = arr1.min (), let mx = arr1.max () else {
343
+ return []
344
+ }
345
+
346
+ var ans = [Int ]()
347
+ for x in arr2 {
348
+ while cnt[x] > 0 {
349
+ ans.append (x)
350
+ cnt[x] -= 1
186
351
}
187
352
}
188
-
189
- for num in 0 ..< frequency. count {
190
- while frequency[num ] > 0 {
191
- result .append (num )
192
- frequency[num ] -= 1
353
+
354
+ for x in mi ... mx {
355
+ while cnt[x ] > 0 {
356
+ ans .append (x )
357
+ cnt[x ] -= 1
193
358
}
194
359
}
195
-
196
- return result
360
+
361
+ return ans
197
362
}
198
363
}
199
-
200
364
```
201
365
202
366
<!-- tabs: end -->
0 commit comments