1122. 数组的相对排序
1122. 数组的相对排序
给你两个数组,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 中
解题思路:
数组一和数组二对比,相等则交换数组一中的数到前面去,最后sort(begin+tmp,end)即可。
代码:
#include<iostream>
#include<bits/stdc++.h>
#include<vector>
using namespace std;
//核心代码
vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
int tmp = 0;
for(int i = 0;i<arr2.size();++i)
for(int j = tmp;j<arr1.size();++j){
if(arr1[j] == arr2[i]){
swap(arr1[j],arr1[tmp]); ++tmp;
}
}
sort(arr1.begin()+tmp,arr1.end());
return arr1;
}
//
int main(){
int n,m,num;
cin>>n;
vector<int >vec1,vec2;
for (int i = 0; i < n; i++)
{
cin>>num;
vec1.push_back(num);
}
cin>>m;
for (int i = 0; i < m; i++)
{
cin>>num;
vec2.push_back(num);
}
vec1=relativeSortArray(vec1,vec2);
for (int i = 0; i < n; i++)
{
cout<<vec1[i]<<" ";
}
}
测试样例:
输入:
11
2 3 1 3 2 4 6 7 9 2 19
6
2 1 4 3 9 6
输出:
2 2 2 1 4 3 3 9 6 7 19
计数排序
这一题第一反应是自定义比较函数,然后再进行排序,但是做完之后参考^2
2
发现,最简单的是用计数排序,充分利用了题目所给提示信息
思路也很清晰,先将arr1中的数全都记录到数组count中,然后遍历arr2的同时,将arr2中的数置入arr1,注意由于arr2中的数在arr1中也出现了,所以直接从count中取出即可
处理好arr2之后,再处理剩下的数字,一格一格往里填就好了
void relativeSortArray(vector<int> arr1,vector<int> arr2){
int *count = new int[1001];
//将arr1中的数记录下来
int len1 =arr1.size();
int len2 =arr2.size();
for (int i = 0; i < len1; i++)
{
count[arr1[i]]++;
}
int t=0;
//先安排arr2中的数
for (int i = 0; i < len2; i++)
{
while (count[arr2[i]]>0)
{
arr[t++]=arr2[i];
count[arr2[i]]--;
}
}
//再安排剩下的数
sort(arr1.begin()+t,arr1.end());
for (int i = 0; i < len1; i++)
{
cout<<arr1[i]<<" ";
}
}
因上求缘,果上努力~~~~ 作者:图神经网络,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/13461168.html