Skip to content

Commit f8ea6eb

Browse files
committed
feat: add solutions to lcof2 problem:No.075
1 parent 362159f commit f8ea6eb

File tree

6 files changed

+178
-0
lines changed

6 files changed

+178
-0
lines changed

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

+97
Original file line numberDiff line numberDiff line change
@@ -42,22 +42,119 @@
4242

4343
<!-- 这里可写通用的实现逻辑 -->
4444

45+
由于本题数据范围是 `[0, 1000]`,因此我们可以开辟一个长度为 1001 的数组 mp,记录 arr1 的元素以及出现的次数。
46+
47+
接着,遍历 arr2 中每个元素 x,若 `mp[x]` 大于 0,循环将 x 加入到答案数组 arr1 中,并且递减 `mp[x]`。遍历结束后,再从下标 `j = 0` 开始遍历 mp,若遇到 `mp[j]` 大于 0,将 `mp[j]` 个 j 加入到答案数组 arr1 中。
48+
49+
最后返回 arr1 即可。
50+
4551
<!-- tabs:start -->
4652

4753
### **Python3**
4854

4955
<!-- 这里可写当前语言的特殊实现逻辑 -->
5056

5157
```python
58+
class Solution:
59+
def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
60+
mp = {num: i for i, num in enumerate(arr2)}
61+
arr1.sort(key=lambda x: (mp.get(x, 10000), x))
62+
return arr1
63+
```
5264

65+
```python
66+
class Solution:
67+
def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
68+
mp = [0] * 1001
69+
for x in arr1:
70+
mp[x] += 1
71+
i = 0
72+
for x in arr2:
73+
while mp[x] > 0:
74+
arr1[i] = x
75+
mp[x] -= 1
76+
i += 1
77+
for x, cnt in enumerate(mp):
78+
for _ in range(cnt):
79+
arr1[i] = x
80+
i += 1
81+
return arr1
5382
```
5483

5584
### **Java**
5685

5786
<!-- 这里可写当前语言的特殊实现逻辑 -->
5887

5988
```java
89+
class Solution {
90+
public int[] relativeSortArray(int[] arr1, int[] arr2) {
91+
int[] mp = new int[1001];
92+
for (int x : arr1) {
93+
++mp[x];
94+
}
95+
int i = 0;
96+
for (int x : arr2) {
97+
while (mp[x]-- > 0) {
98+
arr1[i++] = x;
99+
}
100+
}
101+
for (int j = 0; j < mp.length; ++j) {
102+
while (mp[j]-- > 0) {
103+
arr1[i++] = j;
104+
}
105+
}
106+
return arr1;
107+
}
108+
}
109+
```
110+
111+
### **C++**
112+
113+
```cpp
114+
class Solution {
115+
public:
116+
vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
117+
vector<int> mp(1001);
118+
for (int x : arr1) ++mp[x];
119+
int i = 0;
120+
for (int x : arr2)
121+
{
122+
while (mp[x]-- > 0) arr1[i++] = x;
123+
}
124+
for (int j = 0; j < mp.size(); ++j)
125+
{
126+
while (mp[j]-- > 0) arr1[i++] = j;
127+
}
128+
return arr1;
129+
}
130+
};
131+
```
60132
133+
### **Go**
134+
135+
```go
136+
func relativeSortArray(arr1 []int, arr2 []int) []int {
137+
mp := make([]int, 1001)
138+
for _, x := range arr1 {
139+
mp[x]++
140+
}
141+
i := 0
142+
for _, x := range arr2 {
143+
for mp[x] > 0 {
144+
arr1[i] = x
145+
mp[x]--
146+
i++
147+
}
148+
}
149+
for j, cnt := range mp {
150+
for cnt > 0 {
151+
arr1[i] = j
152+
i++
153+
cnt--
154+
}
155+
}
156+
return arr1
157+
}
61158
```
62159

63160
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public:
3+
vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
4+
vector<int> mp(1001);
5+
for (int x : arr1) ++mp[x];
6+
int i = 0;
7+
for (int x : arr2)
8+
{
9+
while (mp[x]-- > 0) arr1[i++] = x;
10+
}
11+
for (int j = 0; j < mp.size(); ++j)
12+
{
13+
while (mp[j]-- > 0) arr1[i++] = j;
14+
}
15+
return arr1;
16+
}
17+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
func relativeSortArray(arr1 []int, arr2 []int) []int {
2+
mp := make([]int, 1001)
3+
for _, x := range arr1 {
4+
mp[x]++
5+
}
6+
i := 0
7+
for _, x := range arr2 {
8+
for mp[x] > 0 {
9+
arr1[i] = x
10+
mp[x]--
11+
i++
12+
}
13+
}
14+
for j, cnt := range mp {
15+
for cnt > 0 {
16+
arr1[i] = j
17+
i++
18+
cnt--
19+
}
20+
}
21+
return arr1
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public int[] relativeSortArray(int[] arr1, int[] arr2) {
3+
int[] mp = new int[1001];
4+
for (int x : arr1) {
5+
++mp[x];
6+
}
7+
int i = 0;
8+
for (int x : arr2) {
9+
while (mp[x]-- > 0) {
10+
arr1[i++] = x;
11+
}
12+
}
13+
for (int j = 0; j < mp.length; ++j) {
14+
while (mp[j]-- > 0) {
15+
arr1[i++] = j;
16+
}
17+
}
18+
return arr1;
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution:
2+
def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
3+
mp = [0] * 1001
4+
for x in arr1:
5+
mp[x] += 1
6+
i = 0
7+
for x in arr2:
8+
while mp[x] > 0:
9+
arr1[i] = x
10+
mp[x] -= 1
11+
i += 1
12+
for x, cnt in enumerate(mp):
13+
for _ in range(cnt):
14+
arr1[i] = x
15+
i += 1
16+
return arr1

solution/1100-1199/1122.Relative Sort Array/README.md

+6
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@
3939

4040
<!-- 这里可写通用的实现逻辑 -->
4141

42+
由于本题数据范围是 `[0, 1000]`,因此我们可以开辟一个长度为 1001 的数组 mp,记录 arr1 的元素以及出现的次数。
43+
44+
接着,遍历 arr2 中每个元素 x,若 `mp[x]` 大于 0,循环将 x 加入到答案数组 arr1 中,并且递减 `mp[x]`。遍历结束后,再从下标 `j = 0` 开始遍历 mp,若遇到 `mp[j]` 大于 0,将 `mp[j]` 个 j 加入到答案数组 arr1 中。
45+
46+
最后返回 arr1 即可。
47+
4248
<!-- tabs:start -->
4349

4450
### **Python3**

0 commit comments

Comments
 (0)