数组序号转换
难度:
标签:
题目描述
代码结果
运行时间: 56 ms, 内存: 34.6 MB
/*
* 题目思路:
* 1. 使用Java Stream对数组进行排序。
* 2. 使用Map记录元素及其序号。
* 3. 使用Stream对原数组进行序号转换。
*/
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.IntStream;
public class RankTransformArrayStream {
public int[] arrayRankTransform(int[] arr) {
int[] sortedArr = Arrays.stream(arr).sorted().toArray(); // Stream排序
Map<Integer, Integer> rankMap = new HashMap<>(); // 记录元素及其序号
int[] rank = {1}; // 序号从1开始
Arrays.stream(sortedArr).distinct().forEach(num -> rankMap.put(num, rank[0]++)); // 记录序号
return Arrays.stream(arr).map(rankMap::get).toArray(); // 转换序号
}
}
解释
方法:
这个解法首先使用了集合来去除数组中的重复元素,然后对这个集合进行排序,以保证元素的序号是按照从小到大的顺序来分配的。接着,利用枚举函数enumerate,从1开始为排序后的元素生成一个序号映射(存储在字典ranks中)。最后,遍历原始数组arr,根据字典ranks里的映射关系,将arr中的每个元素替换为其对应的序号。
时间复杂度:
O(n log n)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么在该问题中使用集合来去除重复元素而不是其他数据结构,例如列表或哈希表?
▷🦆
在创建排名字典时,enumerate函数是如何确保从1开始编号的?
▷🦆
给定解法在处理极端情况(如数组长度接近0或105)时的表现如何?是否有可能优化以处理特殊或极端输入?
▷🦆
在实际应用中,如果原数组非常大,使用这种方法的内存消耗是否可能成为问题?有没有可能的优化策略来减少内存使用?
▷