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]<<" ";
    }
}

 

posted @ 2020-08-09 00:37  多发Paper哈  阅读(142)  评论(0编辑  收藏  举报
Live2D