码迷,mamicode.com
首页 > 其他好文 > 详细

1331. Rank Transform of an Array

时间:2020-07-04 15:11:29      阅读:58      评论:0      收藏:0      [点我收藏+]

标签:问题   highlight   return   span   最小值   一个   nts   back   auto   

问题:

给定一个数组,对所有元素进行,按大小排名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 };

 

1331. Rank Transform of an Array

标签:问题   highlight   return   span   最小值   一个   nts   back   auto   

原文地址:https://www.cnblogs.com/habibah-chang/p/13234827.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!