📌  相关文章
📜  检查数组元素是否是来自另一个数组的两个元素的串联(1)

📅  最后修改于: 2023-12-03 14:55:47.106000             🧑  作者: Mango

题目描述

给定两个数组 nums1nums2,编写一个函数来检查 nums1 中的所有元素是否可以从 nums2 中组合得到,且每个组合仅包含 nums2 中的两个元素。

函数签名
def check_concatenation(nums1: List[int], nums2: List[int]) -> bool:
    pass
输入
  • nums1:一个整数类型的列表,不含重复元素
  • nums2:一个整数类型的列表,含有重复元素
输出
  • 布尔值:True 表示可以组合,False 表示不可以组合。
示例
assert check_concatenation([1, 2, 3, 4, 5], [2, 3, 4, 5, 6, 7])
assert check_concatenation([1, 1, 2, 3], [1, 1, 1, 2, 2, 3, 3, 3])
assert not check_concatenation([1, 2, 3, 4], [4, 3, 2, 1])
解题思路

遍历 nums1中的所有元素,对于每个元素 x,在 nums2 中搜索是否存在形如 (x, y) 的元组,其中 ynums2 中的元素。如果存在,说明可以从 nums2 中组合得到 x

对于每个元素在 nums2 中的搜索使用一个哈希表实现,时间复杂度为 $O(n)$。

代码实现
from typing import List

def check_concatenation(nums1: List[int], nums2: List[int]) -> bool:
    pairs = {}
    for n in nums2:
        if n not in pairs:
            pairs[n] = set()
        for m in nums2:
            pairs[n].add((n, m))

    for n in nums1:
        found = False
        if n in pairs:
            for pair in pairs[n]:
                if pair[0] == n and pair[1] in nums2:
                    found = True
                    break
        if not found:
            return False

    return True
复杂度分析
  • 时间复杂度:$O(n)$,其中 $n$ 是 nums2 的长度。
  • 空间复杂度:$O(n)$,使用了哈希表来存储元素的组合。