通过万岁!!!
- 题目:给你一个数组,然后让你找到每个数在这个数组中的排名,然后输出出来。如果两个数一样,则排名也一样,后面一个数的排名等于这个排名前面一个的排名+1即可。不是现实生活中跳过名字的那种情况。并且这里数小的话,排名就大。
- 思路一:直接用一个treemap,然后key是这个数,value是这个数对应的下标,因为数会相同,所以value是一个list,然后遍历这个treemap遍历这个treemap,将value所对应的下标,改成一个排名值即可。
- 思路二:还是上面的差不多,同样用一个map,但是不是treemap,而是普通的hashmap即可。key是数,value是这个数对应的排名。前提是,我们往map中加入内容的时候需要知道排名,所以可以先对数组进行排序。需要注意的是这里的排名不是排序以后数组的idx,而是map的size+1,因为会有相同数的情况。拿到map以后,我们遍历原数组,并从map中拿到排名即可。
- 技巧:哈希表
java代码——思路一
class Solution {
public int[] arrayRankTransform(int[] arr) {
Map> treeMap = new TreeMap<>();// 值和值对应的下标
for (int i = 0; i < arr.length; i++) {
treeMap.putIfAbsent(arr[i], new ArrayList<>());
treeMap.get(arr[i]).add(i);
}
int idx = 1;
for (Map.Entry> node : treeMap.entrySet()) {
List list = node.getValue();
for (int i = 0; i < list.size(); i++) {
arr[list.get(i)] = idx;
}
idx++;
}
return arr;
}
}
java代码——思路二
class Solution {
public int[] arrayRankTransform(int[] arr) {
int[] sortArrs = arr.clone();
Arrays.sort(sortArrs);
Map map = new HashMap<>();// key是数,value是排名
for (int num : sortArrs) {
map.putIfAbsent(num, map.size() + 1);
}
for (int i = 0; i < arr.length; i++) {
arr[i] = map.get(arr[i]);
}
return arr;
}
}
- 总结:这两个思路其实差不多,但是treemap的时候,每次加入,都会排序,时间复杂度会较高。



