Leetcode-Relative Sort Array

难度:简单,标签:array

Posted by LT on July 16, 2019
  1. 本题链接
  2. 更多

1122. Relative Sort Array

描述:给一个待排序的数组A,以及一个位置打打乱的参考数组B。 如果A的某一个元素在B中,就需要按照B数组的先后顺序进行排序。 如果A的某一个元素不在B中,则需要放在最后面,同时按照大小顺序排序。 思路:map计数即可,然后先原B数组整有的元素依次放入答案容器,最后遍历map将剩下的元素放入答案。 提示:map的key是按升序排列的。 Example 1: Input: arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6] Output: [2,2,2,1,4,3,3,9,6,7,19]

(1,2是一类,3,4是一类)

  1. my solution:(4 ms, 8.7 MB)
     int i, j, count = 0;
     vector<int> output1;
    
     for (i = 0; i<arr2.size(); i++)
     for (j = 0; j<arr1.size(); j++){
         if (arr1[j] == arr2[i]){
             output1.push_back(arr2[i]);
             arr1.erase(arr1.begin() + j);
             j--;
         }
     }
     sort(arr1.begin(), arr1.end());
     output1.insert(output1.end(), arr1.begin(), arr1.end());
     return output1;
    
  2. 利用swap(8 ms, 8.8 MB)
    int index = 0;
    for (int i = 0; i < arr2.size(); ++i)
    {
     for (int j = index; j < arr1.size(); ++j)
     {
         if (arr2[i] == arr1[j]) // find element in arr2
         {
             swap(arr1[j], arr1[index]); // put it at right place
             index++;
         }
     }
    }		
     // sort rest elements
     sort(arr1.begin() + index, arr1.end());
    
     return arr1;
    
  3. 动态规划(0 ms, 8.8 MB)
    vector<int> dp(1001,0);
    //0 <= arr1[i], arr2[i] <= 1000,dp的索引存储的是arr的值,dp[i]是值为i的次数。
    vector<int> res;
     for(int i=0;i<arr1.size();i++) // 保存arr1的每个元素的频数
         dp[arr1[i]]++;
            
     for(int i=0;i<arr2.size();i++)
     {
         for(int j=0;j<dp[arr2[i]];j++) // 保存dp[arr2[i]]个元素arr2[i](重复的元素)到res
             res.push_back(arr2[i]);			
         dp[arr2[i]]=0; // arr2中元素对应的频数置为0
     }
            
     for(int i=0;i<=1000;i++)
         for(int j=0;j<dp[i];j++)
             res.push_back(i);  //升序保存arr1元素到res
     return res;
    
  4. map(8 ms,9.1 MB)
    class Solution {
    public:
     vector<int> relativeSortArray(vector<int>& arr1, vector<int>& arr2) {
         map<int,int> M;
         vector<int> ans;
         for(auto v1: arr1)
             M[v1]++;
         for(auto v2: arr2)
         {
             while(M[v2])
             {
                 ans.push_back(v2);
                 M[v2]--;
             }
         }
         for(auto m: M)
         {
             while(m.second)
             {
                 ans.push_back(m.first);
                 m.second--;
             }
         }
         return ans;
     }
    };