1122:数组的相对顺序(C++)

题目地址:https://leetcode-cn.com/problems/relative-sort-array/

题目描述

给你两个数组,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]

解题思路

思路1:冒泡排序。首先分析题目,发现并不需要开辟额外的内存空间,利用arr1的内存空间即可,通过两层for循环,对数组arr2和数组arr1进行比较,如果arr1中的当前元素与arr2的元素相同,则交换arr1中的当前元素到前一位置,如此便可将数组arr2中的每个元素的相对元素都处理完毕,接下来是对数组arr1中的剩余元素进行排序就行。

思路2:哈希表。看到统计整数次数的题目,第一想法就说哈希表了,没错,就是认准了你啦!我们首先遍历数组arr1,统计每个元素出现的次数,然后遍历数组arr2,根据arr2中每个元素在arr1中出现的次数,将该元素按照出现的次数加入结果集res中,此时,需要注意的是要将哈希表中该元素的相同值从哈希表中删除,否则会造成超时问题,最后将哈希表中未处理的元素加入结果集res中即可,有人会问剩下的元素为啥没有排序呢?回答当然是map是默认升序的噢!而unordered_map则是降序的。

程序源码

思路1

class Solution {
public:
    vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
        if(arr1.size() == 0 || arr2.size() == 0 || arr1.size() < arr2.size()) return {};
        int cnt = 0;
        for(int i = 0; i < arr2.size(); ++i)
        {
            for(int j = cnt; j < arr1.size(); ++j)
            {
                if(arr2[i] == arr1[j])
                {
                    swap(arr1[j], arr1[cnt]); //swap(arr1[j], arr1[cnt++]);
                    ++cnt;
                }
            }

        }
        sort(arr1.begin() + cnt, arr1.end());
        return arr1;
    }
    void swap(int &a, int &b)
    {
        int tmp = b;
        b = a;
        a = tmp;
    }
};

思路2

class Solution {
public:
    vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
        if(arr1.size() == 0 || arr2.size() == 0 || arr1.size() < arr2.size()) return {};
        map<int, int> mp;
        vector<int> res;
        for(auto num1 : arr1)
        {
            mp[num1]++;
        }
        for(auto num2 : arr2)
        {
            while(mp[num2]--) //mp[nums2]为nums2出现的次数
            {
                res.push_back(num2);
            }
            mp.erase(num2);//mp删除与num2相同的元素,即去重
        }
       for(map<int, int> ::iterator it = mp.begin(); it != mp.end(); ++it)
       {
           while((it->second)--) //(K,V)
           {
               res.push_back(it->first);
           }
       } 
       return res;
    }
};
----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
原文地址:https://www.cnblogs.com/wzw0625/p/13448322.html