Leetcode:陣列的相對順序(C++)
阿新 • • 發佈:2020-08-06
題目地址: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; } };