题目地址: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; } };