给定两个数组,arr1
和 arr2
,
arr2
中的元素各不相同arr2
中的每个元素都出现在arr1
中
对 arr1
中的元素进行排序,使 arr1
中项的相对顺序和 arr2
中的相对顺序相同。未在 arr2
中出现过的元素需要按照升序放在 arr1
的末尾。
示例:
输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6] 输出:[2,2,2,1,4,3,3,9,6,7,19]
提示:
1 <= arr1.length, arr2.length <= 1000
0 <= arr1[i], arr2[i] <= 1000
arr2
中的元素arr2[i]
各不相同arr2
中的每个元素arr2[i]
都出现在arr1
中
注意:本题与主站 1122 题相同:https://leetcode.cn/problems/relative-sort-array/
由于本题数据范围是 [0, 1000]
,因此我们可以开辟一个长度为 1001 的数组 mp,记录 arr1 的元素以及出现的次数。
接着,遍历 arr2 中每个元素 x,若 mp[x]
大于 0,循环将 x 加入到答案数组 arr1 中,并且递减 mp[x]
。遍历结束后,再从下标 j = 0
开始遍历 mp,若遇到 mp[j]
大于 0,将 mp[j]
个 j 加入到答案数组 arr1 中。
最后返回 arr1 即可。
class Solution:
def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
mp = {num: i for i, num in enumerate(arr2)}
arr1.sort(key=lambda x: (mp.get(x, 10000), x))
return arr1
class Solution:
def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
mp = [0] * 1001
for x in arr1:
mp[x] += 1
i = 0
for x in arr2:
while mp[x] > 0:
arr1[i] = x
mp[x] -= 1
i += 1
for x, cnt in enumerate(mp):
for _ in range(cnt):
arr1[i] = x
i += 1
return arr1
class Solution {
public int[] relativeSortArray(int[] arr1, int[] arr2) {
int[] mp = new int[1001];
for (int x : arr1) {
++mp[x];
}
int i = 0;
for (int x : arr2) {
while (mp[x]-- > 0) {
arr1[i++] = x;
}
}
for (int j = 0; j < mp.length; ++j) {
while (mp[j]-- > 0) {
arr1[i++] = j;
}
}
return arr1;
}
}
class Solution {
public:
vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
vector<int> mp(1001);
for (int x : arr1) ++mp[x];
int i = 0;
for (int x : arr2) {
while (mp[x]-- > 0) arr1[i++] = x;
}
for (int j = 0; j < mp.size(); ++j) {
while (mp[j]-- > 0) arr1[i++] = j;
}
return arr1;
}
};
func relativeSortArray(arr1 []int, arr2 []int) []int {
mp := make([]int, 1001)
for _, x := range arr1 {
mp[x]++
}
i := 0
for _, x := range arr2 {
for mp[x] > 0 {
arr1[i] = x
mp[x]--
i++
}
}
for j, cnt := range mp {
for cnt > 0 {
arr1[i] = j
i++
cnt--
}
}
return arr1
}