Skip to content

Commit 957fb1e

Browse files
authored
feat: add solutions to lc/lcof2 problems (#3411)
lc No.1122 & lcof2 No.075.Relative Sort Array
1 parent b506739 commit 957fb1e

File tree

18 files changed

+593
-150
lines changed

18 files changed

+593
-150
lines changed

lcof2/剑指 Offer II 075. 数组相对排序/README.md

Lines changed: 237 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,11 @@ edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%2
5050

5151
<!-- solution:start -->
5252

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$ 的长度。
5458

5559
<!-- tabs:start -->
5660

@@ -59,30 +63,26 @@ edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%2
5963
```python
6064
class Solution:
6165
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))
6568
```
6669

6770
#### Java
6871

6972
```java
7073
class Solution {
7174
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);
7578
}
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])};
8182
}
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];
8686
}
8787
return arr1;
8888
}
@@ -95,14 +95,18 @@ class Solution {
9595
class Solution {
9696
public:
9797
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]);
103106
}
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;
106110
}
107111
return arr1;
108112
}
@@ -113,90 +117,250 @@ public:
113117
114118
```go
115119
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
119123
}
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}
126130
}
127131
}
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]
134137
}
135138
return arr1
136139
}
137140
```
138141

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+
139180
<!-- tabs:end -->
140181

141182
<!-- solution:end -->
142183

143-
<!-- solution:start-->
184+
<!-- solution:start -->
144185

145-
### 方法二
186+
### 方法二:计数排序
146187

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 -->
148193

149194
#### Python3
150195

151196
```python
152197
class Solution:
153198
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 = []
158201
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+
}
168330
```
169331

170332
#### Swift
171333

172334
```swift
173335
class Solution {
174336
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
186351
}
187352
}
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
193358
}
194359
}
195-
196-
return result
360+
361+
return ans
197362
}
198363
}
199-
200364
```
201365

202366
<!-- tabs:end -->

0 commit comments

Comments
 (0)