1331. Rank Transform of an Array

Posted habibah-chang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 };

 

以上是关于1331. Rank Transform of an Array的主要内容,如果未能解决你的问题,请参考以下文章

leetcode1331. Rank Transform of an Array

LeetCode --- 1331. Rank Transform of an Array 解题报告

LeetCode --- 1331. Rank Transform of an Array 解题报告

LeetCode 1331.数组序号转换

ORACLE如何使用RANK函数

Codeforces Round #502 (in memory of Leopoldo Taravilse, Div. 1 + Div. 2) A The Rank