• 1331. Rank Transform of an Array


    问题:

    给定一个数组,对所有元素进行,按大小排名rank,同样大小排名相同。

    Example 1:
    Input: arr = [40,10,20,30]
    Output: [4,1,2,3]
    Explanation: 40 is the largest element. 10 is the smallest. 20 is the second smallest. 30 is the third smallest.
    
    Example 2:
    Input: arr = [100,100,100]
    Output: [1,1,1]
    Explanation: Same elements share the same rank.
    
    Example 3:
    Input: arr = [37,12,28,9,100,56,80,5,12]
    Output: [5,3,4,2,8,6,7,1,3] 
    
    Constraints:
    0 <= arr.length <= 105
    -109 <= arr[i] <= 109
    

      

    解法:

    解法一:

    将原数组的元素和index共同记录的情况下,根据元素进行排序。

    这里使用排序map。对key=元素值,value=拥有相同元素值的index列表。

    按照排序顺序(顺序遍历map),对原数组对应的index上的值从1开始递增赋值。

    代码参考:

     1 class Solution {
     2 public:
     3     vector<int> arrayRankTransform(vector<int>& arr) {
     4         map<int, vector<int>>arrmap;
     5         for(int i=0; i<arr.size(); i++){
     6             arrmap[arr[i]].push_back(i);
     7         }
     8         int i=1;
     9         for(auto am:arrmap){
    10             for(auto idx:am.second){
    11                 arr[idx]=i;
    12             }
    13             i++;
    14         }
    15         return arr;
    16     }
    17 };

    解法二:

    求出原数组的最大值maxv和最小值minv

    所有元素,相对于最小值minv都有一个差值diff

    将这个差值记录下来,成为数组diff[],这个数组的size为:maxv-minv+1

    遍历原数组,记录所有元素和minv的差值。

    然后遍历,所得差值数组,差值从0开始,对diff[i]>0(存在diff[i]个元素和minv的差值 i )的,

    进行从1开始的rank排序:diff[i]=rank。

    则得到,与minv差值为 i 的元素应该排 第diff[i]名

    再遍历原数组arr

    arr[i]=diff[arr[i]-minv]

    元素arr[i]所排名次,应为,它与minv差值(arr[i]-minv)索引下的diff[]。

    代码参考:

     1 class Solution {
     2 public:
     3     vector<int> arrayRankTransform(vector<int>& arr) {
     4         int maxv=INT_MIN, minv=INT_MAX;
     5         if(arr.size()==0) return arr;
     6         for(int a:arr){
     7             maxv=max(maxv,a);
     8             minv=min(minv,a);
     9         }
    10         vector<int>diff(maxv-minv+1,0);
    11         for(int a:arr){
    12             diff[a-minv]++;
    13         }
    14         int rank=1;
    15         for(int i=0;i<diff.size();i++){
    16             if(diff[i]>0){
    17                 diff[i]=rank;
    18                 rank++;
    19             }
    20         }
    21         for(int i=0; i<arr.size(); i++){
    22             arr[i]=diff[arr[i]-minv];
    23         }
    24         
    25         return arr;
    26     }
    27 };
  • 相关阅读:
    【转】关于Vue打包的一个要注意的地方
    ES6 简介
    java ee / JVM Tuning
    network / ifconfig
    My live Read / Oray.com / huashengke / peanut shell / dnspod.cn
    network / VXLAN spine和bord-leaf
    hd + TP-Link SG2008MP / switch
    elasticSearch+ik_smart 支持 符号检索
    使用java+http+Range头 实现视频分段下载
    springBoot+elasticSearch 使用function_score自定义评分
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/13234827.html
Copyright © 2020-2023  润新知