1122.数组的相对排序
给你两个数组,arr1 和 arr2,
arr2 中的元素各不相同
arr2 中的每个元素都出现在 arr1 中
对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。
1.暴力法
暴力遍历两个数组,若相等代表为arr2中元素出现在arr1,与前面元素交换,最后再对剩余元素排序
class Solution {
public:
vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
int tmp = 0;
for(int i=0;i<arr2.size();i++)
{
for(int j=0;j<arr1.size();j++)
{
if(arr1[j] == arr2[i])
{
swap(arr1[j],arr1[tmp]);
tmp++;
}
}
}
sort(arr1.begin()+tmp,arr1.end());
return arr1;
}
};
2.桶排序(计数排序)
三次循环,由于数的取值范围固定,先遍历arr1在特定数值上计数,再遍历arr2找到相同值赋值在arr1上,最后遍历桶把剩余所有元素加在arr1后面。
class Solution {
public:
vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
vector<int> bullet(1001);
for(int i=0;i<arr1.size();i++ )
{
bullet[arr1[i]]++;
}
int k=0;
for(int i=0;i<arr2.size();i++)
{
while(bullet[arr2[i]]>0)
{
arr1[k] = arr2[i];
bullet[arr2[i]]--;
k++;
}
}
for (int i = 0; i < bullet.size(); i++)
{
while (bullet[i] >0)
{
arr1[k++] = i;
bullet[i]--;
}
}
return arr1;
}
};