每日LeetCode —— 1331. 分数加减运算

77 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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. 数组序号转换

解题思路

1.png

       使用一个数组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 操作。