Description
Given two arrays arr1
and arr2
, the elements of arr2
are distinct, and all elements in arr2
are also in arr1
.
Sort the elements of arr1
such that the relative ordering of items in arr1
are the same as in arr2
. Elements that do not appear in arr2
should be placed at the end of arr1
in ascending order.
Example 1:
Input: arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6] Output: [2,2,2,1,4,3,3,9,6,7,19]
Example 2:
Input: arr1 = [28,6,22,8,44,17], arr2 = [22,28,8,6] Output: [22,28,8,6,17,44]
Constraints:
1 <= arr1.length, arr2.length <= 1000
0 <= arr1[i], arr2[i] <= 1000
- All the elements of
arr2
are distinct. - Each
arr2[i]
is inarr1
.
Code
Time Complexity: , Space Complexity:
class Solution {
public:
vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
unordered_map<int, int> mp;
for(int i = 0; i < arr2.size(); i++)
mp[arr2[i]] = i;
auto cmp = [&](const int& n1, const int& n2){
if(mp.find(n1) != mp.end() && mp.find(n2) != mp.end())
return mp[n1] < mp[n2];
else {
if(mp.find(n1) == mp.end() && mp.find(n2) != mp.end()) {
return false;
} else if(mp.find(n1) != mp.end() && mp.find(n2) == mp.end()) {
return true;
} else {
return n1 < n2;
}
}
};
sort(arr1.begin(), arr1.end(), cmp);
return arr1;
}
};
使用 map 是因為不在 arr2 中的 arr1 元素需要 sort in ascending order。
class Solution {
public:
vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
map<int, int> mp;
for(auto a: arr1) {
mp[a]++;
}
int index = 0;
for(auto a: arr2) {
while(mp[a] > 0) {
arr1[index++] = a;
mp[a]--;
}
}
for(auto m: mp) {
while(m.second-- > 0)
arr1[index++] = m.first;
}
return arr1;
}
};