LeetCode 题解工作台

数组的相对排序

给你两个数组, arr1 和 arr2 , arr2 中的元素各不相同, arr2 中的每个元素都出现在 arr1 中。 对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。 示例 1: 输入:…

category

4

题型

code_blocks

6

代码语言

hub

3

相关题

当前训练重点

简单 · 数组·哈希·扫描

bolt

答案摘要

我们先用哈希表 记录数组 中每个元素的位置。然后,我们将数组 中的每个元素映射成一个二元组 $(pos.get(x, 1000 + x), x)$,并对二元组进行排序。最后我们取出所有二元组的第二个元素并返回即可。 时间复杂度 $O(n \times \log n + m)$,空间复杂度 $O(n + m)$。其中 和 分别是数组 和 的长度。

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 数组·哈希·扫描 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

给你两个数组,arr1 和 arr2arr2 中的元素各不相同,arr2 中的每个元素都出现在 arr1 中。

arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。

 

示例 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 <= arr1.length, arr2.length <= 1000
  • 0 <= arr1[i], arr2[i] <= 1000
  • arr2 中的元素 arr2[i]  各不相同 
  • arr2 中的每个元素 arr2[i] 都出现在 arr1 中
lightbulb

解题思路

方法一:自定义排序

我们先用哈希表 pospos 记录数组 arr2arr2 中每个元素的位置。然后,我们将数组 arr1arr1 中的每个元素映射成一个二元组 (pos.get(x,1000+x),x)(pos.get(x, 1000 + x), x),并对二元组进行排序。最后我们取出所有二元组的第二个元素并返回即可。

时间复杂度 O(n×logn+m)O(n \times \log n + m),空间复杂度 O(n+m)O(n + m)。其中 nnmm 分别是数组 arr1arr1arr2arr2 的长度。

1
2
3
4
5
class Solution:
    def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
        pos = {x: i for i, x in enumerate(arr2)}
        return sorted(arr1, key=lambda x: pos.get(x, 1000 + x))
speed

复杂度分析

指标
时间O(n + m + k)
空间O(k)
psychology

面试官常问的追问

外企场景
  • question_mark

    Look for an efficient implementation that minimizes unnecessary sorting.

  • question_mark

    Test the candidate's ability to use a hashmap for ordering and scanning.

  • question_mark

    Check how the candidate handles edge cases, such as when arr1 and arr2 are the same length.

warning

常见陷阱

外企场景
  • error

    Failing to account for elements in arr1 that aren't in arr2, leading to incorrect output.

  • error

    Not maintaining the relative order of elements in arr1 that match arr2.

  • error

    Not sorting the leftover elements of arr1 correctly at the end.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Handling cases where arr1 and arr2 contain repeated elements.

  • arrow_right_alt

    Optimizing space usage if constraints change, such as limiting space complexity to O(1).

  • arrow_right_alt

    Implementing a version that sorts arr1 directly without using a hashmap.

help

常见问题

外企场景

数组的相对排序题解:数组·哈希·扫描 | LeetCode #1122 简单