题目地址:
https://leetcode.com/problems/rank-transform-of-an-array/
给定一个数组,要求将每个数映射成另一个(整)数,并满足下面条件:
1、从
1
1
1开始;
2、保持大小关系不变;
3、所映射到的数要尽量小。
显然只需映射为其排名即可。最小的映射为 1 1 1,然后次小的映射为 2 2 2,以此类推。可以先拷贝原数组,然后对新拷贝的数组进行排序,并用哈希表记录每个数字的排名。代码如下:
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int[] arrayRankTransform(int[] arr) {
if (arr == null || arr.length == 0) {
return arr;
}
// 拷贝原数组,然后对其进行排序
int[] res = Arrays.copyOf(arr, arr.length);
Arrays.sort(res);
// 用哈希表记录每个数字的排名,由小到大,由1到k
int idx = 1;
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < res.length; i++) {
if (!map.containsKey(res[i])) {
map.put(res[i], idx++);
}
}
// 将每个位置替换为其排名
for (int i = 0; i < res.length; i++) {
res[i] = map.get(arr[i]);
}
return res;
}
}
时间复杂度 O ( n log n ) O(n\log n) O(nlogn),空间 O ( n ) O(n) O(n)。