package com.heu.wsq.leetcode.arr;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* 1331. 数组序号转换
* @author wsq
* @date 2021/1/13
* 给你一个整数数组 arr ,请你将数组中的每个元素替换为它们排序后的序号。
* 序号代表了一个元素有多大。序号编号的规则如下:
* 序号从 1 开始编号。
* 一个元素越大,那么序号越大。如果两个元素相等,那么它们的序号相同。
* 每个数字的序号都应该尽可能地小。
*
* 示例 1:
* 输入:arr = [40,10,20,30]
* 输出:[4,1,2,3]
* 解释:40 是最大的元素。 10 是最小的元素。 20 是第二小的数字。 30 是第三小的数字。
*
* 示例 2:
* 输入:arr = [100,100,100]
* 输出:[1,1,1]
* 解释:所有元素有相同的序号。
*
* 链接:https://leetcode-cn.com/problems/rank-transform-of-an-array
*/
public class ArrayRankTransform {
public int[] arrayRankTransform(int[] arr){
int n = arr.length;
int[] newArr = new int[n];
System.arraycopy(arr, 0, newArr, 0, n);
Arrays.sort(newArr);
int id = 1;
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < n; i++){
if (!map.containsKey(newArr[i])){
map.put(newArr[i], id);
id++;
}
}
for (int i = 0; i < n; i++){
arr[i] = map.get(arr[i]);
}
return arr;
}
}