zoukankan      html  css  js  c++  java
  • 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 };
  • 相关阅读:
    使用Unity5.1进行VR开发的配置(最新的未必是最好的!!!)
    从单幅深度图识别人体姿态
    工作中编写存储过程小记
    【积累】根据CheckBox的不选中 ,用JQuery 清除 RidaoButtonList 的选中项
    【积累】LinqToSql复合查询结果转DataTable数据
    MSSSQL 脚本收藏
    VS2010历史记录清理
    PowerDesigner16工具学习笔记-建立CDM
    Android 安装过程中的问题
    Unity3D集成SVN进行版本控制
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/13234827.html
Copyright © 2011-2022 走看看