1122. 数组的相对排序
大约 2 分钟
1122. 数组的相对排序
- 标签:数组、哈希表、计数排序、排序
- 难度:简单
题目链接
题目大意
描述:给定两个数组, 和 ,其中 中的元素各不相同, 中的每个元素都出现在 中。
要求:对 中的元素进行排序,使 中项的相对顺序和 中的相对顺序相同。未在 中出现过的元素需要按照升序放在 的末尾。
说明:
- 。
- 。
示例:
- 示例 1:
输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]
输出:[2,2,2,1,4,3,3,9,6,7,19]
- 示例 2:
输入:arr1 = [28,6,22,8,44,17], arr2 = [22,28,8,6]
输出:[22,28,8,6,17,44]
解题思路
思路 1:计数排序
因为元素值范围在 ,所以可以使用计数排序的思路来解题。
- 使用数组 统计 各个元素个数。
- 遍历 数组,将对应元素 按照个数 添加到答案数组 中,同时在 数组中减去对应个数。
- 然后在处理 中剩余元素,将 中大于 的元素下标依次添加到答案数组 中。
- 最后返回答案数组 。
思路 1:代码
class Solution:
def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
# 计算待排序序列中最大值元素 arr_max 和最小值元素 arr_min
arr1_min, arr1_max = min(arr1), max(arr1)
# 定义计数数组 counts,大小为 最大值元素 - 最小值元素 + 1
size = arr1_max - arr1_min + 1
counts = [0 for _ in range(size)]
# 统计值为 num 的元素出现的次数
for num in arr1:
counts[num - arr1_min] += 1
res = []
for num in arr2:
while counts[num - arr1_min] > 0:
res.append(num)
counts[num - arr1_min] -= 1
for i in range(size):
while counts[i] > 0:
num = i + arr1_min
res.append(num)
counts[i] -= 1
return res
思路 1:复杂度分析
- 时间复杂度:。其中 是数组 的长度, 是数组 的长度, 是数组 的最大值。
- 空间复杂度:。