数组的相对排序
难度:
标签:
题目描述
代码结果
运行时间: 23 ms, 内存: 16.2 MB
/*
* 思路:
* 1. 使用map存储arr2中的元素及其顺序。
* 2. 使用Stream对arr1进行排序,分两部分处理:
* - 在arr2中的部分按照map中的顺序排序。
* - 不在arr2中的部分按照自然顺序排序。
* 3. 使用Stream.concat将两个流合并。
*/
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Solution {
public int[] relativeSortArray(int[] arr1, int[] arr2) {
// 创建map存储arr2中的元素及其顺序
Map<Integer, Integer> orderMap = new HashMap<>();
for (int i = 0; i < arr2.length; i++) {
orderMap.put(arr2[i], i);
}
// 使用Stream排序
return Stream.concat(
Arrays.stream(arr1).filter(orderMap::containsKey)
.sorted((a, b) -> orderMap.get(a) - orderMap.get(b)),
Arrays.stream(arr1).filter(a -> !orderMap.containsKey(a)).sorted()
).toArray();
}
}
解释
方法:
该题解采用计数排序的思路来实现。首先,通过一个数组`countarr`来统计`arr1`中每个元素的出现次数。然后,根据`arr2`的顺序,将`arr1`中相应的元素按`arr2`的顺序添加到结果列表`res`中,并在`countarr`中相应减少计数。最后,对于`arr1`中存在但不在`arr2`中的元素,按照升序添加到`res`的末尾。
时间复杂度:
O(n + u)
空间复杂度:
O(u + n)
代码细节讲解
🦆
为什么选择使用计数排序而不是其他排序算法来解决这个问题?
▷🦆
在处理`arr2`中的元素顺序时,你是如何处理`arr1`中不存在的`arr2`中元素的情况的?
▷🦆
为什么在最后遍历计数数组`countarr`时需要从0到`upper+1`遍历,即使某些数字在`arr1`中可能从未出现过?
▷🦆
在将`arr2`中的元素添加到结果列表`res`时,为什么要将对应在`countarr`中的计数置为0?这样做有什么具体的目的吗?
▷