给你两个数组,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
中
分析:
因为涉及到对元素的查找,所以想到了使用map,因为对每一个数字进行查找太耗时
class Solution {
public:
vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
// 保存arr2中每个数字对应的下标
map<int,int> map_arr2;
for(int i=0; i<arr2.size(); i++){
map_arr2[arr2[i]] = i;
}
// 确定arr1中每个数字出现的次数,将未出现在arr2中的保存到not_found
vector<int> not_found;
map<int,int> map_arr1;
for(int i=0; i<arr1.size(); i++){
map<int,int>::iterator iter = map_arr1.find(arr1[i]);
if(iter == map_arr1.end()){
// 查找失败,新建
map_arr1[arr1[i]] = 1;
}else{
// 查找成功,进行计数
map_arr1[arr1[i]] = iter->second+1;
}
// 将有没有出现在arr2中的数字加入到not_found中
if(map_arr2.find(arr1[i]) == map_arr2.end())
not_found.push_back(arr1[i]);
}
// 将出现在arr1中的arr2的数字进行输出
vector<int> result;
for(int i=0; i<arr2.size(); i++)
for(int j=0; j<map_arr1[arr2[i]]; j++)
result.push_back(arr2[i]);
// 添加未出现过的数字
sort(not_found.begin(),not_found.end());
result.insert(result.end(),not_found.begin(),not_found.end());
return result;
}
};