链接
https://leetcode-cn.com/problems/relative-sort-array/
耗时
解题:12 min
题解:12 min
题意
给你两个数组,arr1 和 arr2,
- arr2 中的元素各不相同
- arr2 中的每个元素都出现在 arr1 中
对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。
思路
计数排序的思想。
用哈希表做离散化,计数 arr1 中每个元素出现的数量。然后遍历 arr2,对于 arr2 中的每个元素,按照哈希表记录的 arr1 中这个元素的数量,把这么多个这个元素放入结果中,并用哈希表记录 arr2 中出现过的元素。最后遍历记录 arr1 元素数量的哈希表,如果哈希表中遍历到的元素没在 arr2 中出现过,则按照这个元素的数量把这个元素放入一个临时数组,待遍历结束后,对临时数组进行排序,并将临时数组的元素放在结果的末尾。
时间复杂度:最坏 O ( m a x ( n l o g n , m ) ) O(max(nlogn, m)) O(max(nlogn,m)) n 是 arr1 的长度,m 是 arr2 的长度
AC代码
class Solution {
public:
vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
unordered_map<int, int> cnt;
for(auto x : arr1) {
cnt[x]++;
}
vector<int> ans;
unordered_set<int> flag;
for(auto x : arr2) {
for(int i = 0; i < cnt[x]; ++i) {
ans.push_back(x);
}
flag.insert(x);
}
vector<int> res;
for(auto x : cnt) {
if(flag.count(x.first)) continue;
for(int i = 0; i < x.second; ++i) {
res.push_back(x.first);
}
}
sort(res.begin(), res.end());
ans.insert(ans.end(), res.begin(), res.end());
return ans;
}
};