題目地址:
https://leetcode.com/problems/rank-transform-of-an-array/
給定一個數組,要求將每個數映射成另一個(整)數,並滿足下面條件:
1、從開始;
2、保持大小關係不變;
3、所映射到的數要儘量小。
顯然只需映射爲其排名即可。最小的映射爲,然後次小的映射爲,以此類推。可以先拷貝原數組,然後對新拷貝的數組進行排序,並用哈希表記錄每個數字的排名。代碼如下:
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;
}
}
時間複雜度,空間。