Description
Given an array of integers arr, replace each element with its rank.
The rank represents how large the element is. The rank has the following rules:
- Rank is an integer starting from 1.
- The larger the element, the larger the rank. If two elements are equal, their rank must be the same.
- Rank should be as small as possible.
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.
分析
题目的意思是:给你一个数组,给每个数设置一个从小到大计数的排序值,要求相同的值序号一样。这道题我用了一个字典存储原来数组的值和索引的位置,排序完以后,按照字典找到相应的值坐标,然后标上序号。当然也有更简单的做法就是把元素取set集合之后排序放到一个字典里面,然后再遍历原来的数组得到每一个值的序号。这里是我的原创了,所以就贴我自己的实现版本了哈。
代码
class Solution:
def arrayRankTransform(self, arr: List[int]) -> List[int]:
d=collections.defaultdict(list)
for i,val in enumerate(arr):
d[val].append(i)
arr.sort()
n=len(arr)
index=1
res=[0]*n
prev=-1
for i in range(n):
val=arr[i]
if(prev==val):
continue
indexes=d[val]
for id in indexes:
res[id]=index
prev=val
index+=1
return res