题目描述:
给你两个数组,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]
提示:
arr1.length, arr2.length <= 1000
0 <= arr1[i], arr2[i] <= 1000
arr2 中的元素 arr2[i] 各不相同
arr2 中的每个元素 arr2[i] 都出现在 arr1 中
方法1:
主要思路:
(1)先对数组中的元素进行统计,再将统计的数字按照另一个数组中的元素的相对顺序,放回到原数组,并把剩余的元素放回原数组之后,对剩余的元素进行排序;
class Solution {
public:
vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
unordered_map<int,int> mp;
//统计各个元素
for(int& num:arr1){
++mp[num];
}
int pos=0;
//按照另一个数组中的元素的相对顺序进行排序
for(int&num:arr2){
if(mp.count(num)){
for(int i=0;i<mp[num];++i){
arr1[pos++]=num;
}
mp.erase(num);
}
}
int i=pos;
//将剩余的元素进行复制和排序
for(auto&it:mp){
for(int j=0;j<it.second;++j){
arr1[i++]=it.first;
}
}
sort(arr1.begin()+pos,arr1.end());
return arr1;
}
};