数组的相对排序
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 15 ms, 内存: 16.0 MB
/*
* 思路:
* 1. 创建一个映射,记录arr2中每个元素的位置。
* 2. 使用Java Stream对arr1中的元素进行排序:
* - 先根据arr2中的顺序排序,
* - 再根据自然顺序排序。
*/
import java.util.*;
import java.util.stream.*;
public class RelativeSortArrayStream {
public int[] relativeSortArray(int[] arr1, int[] arr2) {
Map<Integer, Integer> rank = IntStream.range(0, arr2.length)
.boxed()
.collect(Collectors.toMap(i -> arr2[i], i -> i));
return Arrays.stream(arr1)
.boxed()
.sorted((a, b) -> {
if (rank.containsKey(a) && rank.containsKey(b)) {
return rank.get(a) - rank.get(b);
} else if (rank.containsKey(a)) {
return -1;
} else if (rank.containsKey(b)) {
return 1;
} else {
return a - b;
}
})
.mapToInt(i -> i)
.toArray();
}
}
解释
方法:
题解采用了计数排序的方法。首先创建一个频率数组,数组长度为arr1中最大元素加一,用于记录arr1中每个元素的出现次数。然后按照arr2的顺序,从频率数组中读取并构建结果数组,最后将剩余的未在arr2中出现的元素按照自然数顺序追加到结果数组的末尾。
时间复杂度:
O(n + m + max)
空间复杂度:
O(max)
代码细节讲解
🦆
题解中提到`按照arr2的顺序`,如果arr2中的元素在arr1中出现的顺序与arr2不同,这种情况下算法输出是否会受到影响?
▷🦆
在构建频率数组时,为什么选择数组长度为`arr1中最大元素加一`而不是根据实际的元素种类数来定义长度?
▷🦆
算法中提到`避免重复添加`通过将频率设置为0实现,这种方法是否最优,有没有更高效的处理方式?
▷