携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
题目描述
给定一个整数数组,将数组中的元素替换为他们排序后的序号;
例1:输入:"[5,4,3,1]" 输出:"[4,3,2,1]"
例2:输入:"[99,54,12,56,12]" 输出:"[4,2,1,3,1]"
本题值得注意的地方
- 给出的结果应是该位置元素在所有元素中大小的序号,例如例二中12为最小,则应将所有12元素所在的位置的值改为1。
原题地址:1331. 数组序号转换
解题思路
使用一个数组vec来保存原数组arr中的元素以及其对应的位置,接着对vec进行按第一个元素进行排序。
判断当前元素的大小序号,这里采用比较当前元素与前面的一个元素相比较是否相等的方法,若不相等则当前元素大小序号加 1 ,所以为了避免数组访问越界的情况,这里的遍历从 1 开始。在遍历的同时修改arr对应位置的元素值。
实现代码
class Solution {
public:
vector<int> arrayRankTransform(vector<int>& arr) {
// 若所给的数组为空 则返回
if(!arr.size()) return arr;
// 用来存储数组元素与其对应的下标
vector<pair<int,int>> vec;
for(int i=0;i<arr.size();i++) vec.push_back({arr[i],i});
// 默认按照pair的第一个参数也就是数组的元素进行排序
sort(vec.begin(),vec.end());
// 记录元素大小的序号
int index=1;
arr[vec[0].second]=index;
// 从 1 开始遍历,可以避免判断 i-1 时访问数组越界的情况
for(int i=1;i<vec.size();i++)
// 根据排序后的 vec,将原数组中的元素替换为排序后的序号
arr[vec[i].second]=vec[i].first==vec[i-1].first?index:++index;
return arr;
}
};
当然这里也可以利用 map<int,vector<int>> map 来存储每个元素的值所对应的下标,map在插入一个键时会动态的维护大小顺序,这样可以省去后面的 sort 操作。