zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    C语言内存分析
    算法之快速排序
    单链表逆转
    C程序设计语言之一
    vim插件配置(一)
    makefile示例
    cocos2d基础入门
    Makefile
    Makefile
    GCC编译四阶段
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/13461168.html
Copyright © 2011-2022 走看看