給你一個整數陣列 arr ,請你將陣列中的每個元素替換為它們排序後的序號。
序號代表了一個元素有多大。序號編號的規則如下:
範例 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]
提示:
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;
}
};