Leetcode 1331. 陣列序號轉換

2022-07-16 15:00:12

給你一個整數陣列 arr ,請你將陣列中的每個元素替換為它們排序後的序號。

序號代表了一個元素有多大。序號編號的規則如下:

  • 序號從 1 開始編號。
  • 一個元素越大,那麼序號越大。如果兩個元素相等,那麼它們的序號相同。
  • 每個數位的序號都應該儘可能地小。

範例 1:

輸入:arr = [40,10,20,30]
輸出:[4,1,2,3]
解釋:40 是最大的元素。 10 是最小的元素。 20 是第二小的數位。 30 是第三小的數位。

範例 2:

輸入:arr = [100,100,100]
輸出:[1,1,1]
解釋:所有元素有相同的序號。

範例 3:

輸入:arr = [37,12,28,9,100,56,80,5,12]
輸出:[5,3,4,2,8,6,7,1,3]
 

提示:

  • 0 <= arr.length <= 105
  • -10^ 9 <= arr[i] <= 10^9

Code:
常規超時思路

class Solution {
public:
    vector<int> arrayRankTransform(vector<int>& arr) {
        if(arr.size()==0)
            return arr;
        vector<int>arrsrc=arr;
        sort(arr.begin(),arr.end());
        
        
        typedef struct
        {
            int num;
            int index;
        }param;
        
        vector<param>vec;
        vector<int>res;
        
        int cnt=1;
        param p;
        p.num=arr[0];
        p.index=cnt;
        vec.push_back(p);
        
        
        map<int,param>mymap;
        
        
        
        for(int i=1;i<arr.size();i++)
        {
            
            param p;
            p.num=arr[i];
            if(arr[i]==arr[i-1])
            {
                p.index=cnt;
            }
            else
                p.index=++cnt;
            vec.push_back(p);
            
        }
        
        
        
        for(int i=0;i<arrsrc.size();i++)
        {
            
            for(int j=0;j<vec.size();j++)
            {
                if(vec[j].num==arrsrc[i])
                {
                    res.push_back(vec[j].index);
                    break;
                }
            }
            //       res.push_back();
        }
        return res;
        
    }   
};

終極大法:利用map解決時間問題

Code:

class Solution {
public:
    vector<int> arrayRankTransform(vector<int>& arr) {
        vector<int>arrsrc=arr;
        sort(arr.begin(),arr.end());
        
        
        typedef struct
        {
            int num;
            int index;
        }param;
        
        vector<param>vec;
        vector<int>res;
        
        if(arr.size()==0)
            return res;
        
        int cnt=1;
        param p;
        p.num=arr[0];
        p.index=cnt;
        vec.push_back(p);
        map<int,param>mymap;
        mymap[arr[0]]=p;
        for(int i=1;i<arr.size();i++)
        {
            
            param p;
            p.num=arr[i];
            if(arr[i]==arr[i-1])
            {
                p.index=cnt;
            }
            else
                p.index=++cnt;
            vec.push_back(p);
            
            mymap[arr[i]]=p;
            
        }
 
        for(int i=0;i<arrsrc.size();i++)
        {
            res.push_back(mymap[arrsrc[i]].index);
        }
        return res;
        
    }   
};