Given two arrays arr1 and arr2, the elements of arr2 are distinct, and all elements in arr2 are also in arr1.
Sort the elements of arr1 such that the relative ordering of items in arr1 are the same as in arr2. Elements that do not appear in arr2 should be placed at the end of arr1 in ascending order.
Example 1:
Input: arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]
Output: [2,2,2,1,4,3,3,9,6,7,19]
Example 2:
Input: arr1 = [28,6,22,8,44,17], arr2 = [22,28,8,6]
Output: [22,28,8,6,17,44]
Constraints:
1 <= arr1.length, arr2.length <= 1000
0 <= arr1[i], arr2[i] <= 1000
All the elements of arr2 are distinct.
Each arr2[i] is in arr1.
https://leetcode.cn/problems/relative-sort-array/solutions/23501/ji-shu-pai-xu-fei-chang-jian-dan-gao-ding-by-rippl/
思路:计数排序
class Solution:
def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
arr = [0 for _ in range(1001)] # 由于题目说 arr1 的范围在 0-1000,所以生成一个 1001 大小的数组用来存放每个数出现的次数。
ans = [] # 储存答案的数组。
for i in range(len(arr1)): # 遍历 arr1,把整个arr1的数的出现次数储存在 arr 上,arr 的下标对应 arr1 的值,arr 的值对应 arr1 中值出现的次数。
arr[arr1[i]] += 1 # 如果遇到了这个数,就把和它值一样的下标位置上 +1,表示这个数在这个下标 i 上出现了 1 次。
for i in range(len(arr2)): # 遍历 arr2,现在开始要输出答案了。
while arr[arr2[i]] > 0: # 如果 arr2 的值在 arr 所对应的下标位置出现次数大于 0,那么就说明 arr 中的这个位置存在值。
ans.append(arr2[i]) # 如果存在值,那就把它加到 ans 中,因为要按 arr2 的顺序排序。
arr[arr2[i]] -= 1 # 加进去了次数 -1 ,不然就死循环了。
for i in range(len(arr)): # 如果 arr1 的值不在 arr2 中,那么不能就这么结束了,因为题目说了如果不在,剩下的值按照升序排序。
while arr[i] > 0: # 同样也是找到大于 0 的下标,然后一直加到 ans 中,直到次数为 0。
ans.append(i)
arr[i] -= 1
return ans # 返回最终答案。
简化版
class Solution:
def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
bins = [0 for _ in range(1001)]
res = []
for i in arr1:
bins[i] += 1
for i in arr2:
res += [i] * bins[i]
bins[i] = 0
for i in range(len(bins)):
res += [i] * bins[i]
return res
思路二:
题目已提示0 <= arr1[i], arr2[i] <= 1000,由于这个范围不是很大,可以考虑不基于比较的排序-计数排序来解答。
解题步骤
1、定义一个长度为 1001 的数组 hash,用于模拟哈希表。
2、将 arr1 中的所有元素存放在 hash 数组中,其中的键为 arr1 中的元素,值为 arr1 中的元素出现的次数;
3、定义索引 i,初始化为 0,用于重置数组 arr1 中的元素值。
4、遍历数组 arr2,只要 arr2 中的元素在数组 hash 中存在,则将其赋值给 arr1,并对该元素在 hash 中出现的频次减一;
5、针对不是数组 arr2 中的元素,遍历整个数组 hash,只要其元素出现的次数在一次及以上,将其赋值给 arr1,并将该元素在 hash 中出现的频次减一。
举例
以 arr1 = [2,3,3,7,2,1], arr2 = [3,2,1] 为例子,如下图示:
按要求排序后,如下图示:
用数组 hash 记录数组 arr1 中元素出现的次数,如下图示:
遍历数组 arr2,如下图示:

在数组 hash 中判断遍历到 arr2 中的元素出现次数是否大于 0,如下图示:
更新数组 arr1 中元素的值,如下图示:

完整排序过程,如下动图示:

def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
arr = [0 for _ in range(1001)]
ans = []
for i in range(len(arr1)):
arr[arr1[i]] += 1
for i in range(len(arr2)):
while arr[arr2[i]] > 0:
ans.append(arr2[i])
arr[arr2[i]] -= 1
for i in range(len(arr)):
while arr[i] > 0:
ans.append(i)
arr[i] -= 1
return ans
333

被折叠的 条评论
为什么被折叠?



