1. 程式人生 > 實用技巧 >Leetcode:陣列的相對順序(C++)

Leetcode:陣列的相對順序(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;
    }
};