1640. 能否连接形成数组(暴力+哈希)

85 阅读3分钟

image.jpeg

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目提示

    • 1 <= pieces.length <= arr.length <= 100
    • sum(pieces[i].length) == arr.length
    • 1 <= pieces[i].length <= arr.length
    • 1 <= arr[i], pieces[i][j] <= 100
    • arr 中的整数 互不相同
    • pieces 中的整数 互不相同(也就是说,如果将 pieces 扁平化成一维数组,数组中的所有整数互不相同

二、思路分析:

我们今天拿到本题是 leetcode 难度为简单题 1640. 能否连接形成数组。本题要求pieces数组中的元素可以拼接成arr数组,返回布尔类型的。开始解题前,我们需要注意几点细节:

  • pieces 和 arr 数组中的元素无重复的
  • arr 长度会大于 pieces数组
  • piece 数组中的元素都是一维数组,且不允许对pieces[i]进行排序

根据题目内容,解答本题我们可以使用使用暴力枚举和哈希表两种方法进行求解,思路如下:

  • 方法一:暴力法

    • 使用 while循环对arr数组的元素进行遍历,每取一个arr[i]元素,在pieces数组查找
    • pieces 二维数组中找到 arr[i] 与 一维元素中第一个元素相等时的一维数组的索引位置start
    • 当 start 等于 -1时,则代表arr[i]对于pieces数组来说不存在,则无法连接成arr直接返回False
    • 继续使用第二层for循环,在pieces[start][j]一维数组中继续查找arr[i+j]是否相等,如果不相等则返回结果False
    • 每在pieces中一维数组中查找完成后,arr的索引i+len(pieces[start])
    • 直到遍历完arr为止,返回结果True
    class Solution(object):
        def canFormArray(self, arr, pieces):
            """
            :type arr: List[int]
            :type pieces: List[List[int]]
            :rtype: bool
            """
            def findIndex(target,pieces):
                for i in range(len(pieces)):
                    if target == pieces[i][0]:
                        return i
                return -1
            i = 0
            while i < len(arr):
                start = findIndex(arr[i],pieces)
                if start == -1: return False
                for j in range(len(pieces[start])):
                    if arr[i+j] != pieces[start][j]:
                        return False
                i +=len(pieces[start])
            return True
    
  • 方法二:哈希表

    • 因为pieces数组中元素都是独一无二的,我们可以提前使用哈希字典来存储
    • pieces 中一维数组第一元素作为key,其一维数组索引作为value
    • 使用 while循环,从arr数组的起始位置0开始进行遍历
    • 当 arr[i] 不在 字典key list中时,证明pieces无法拼接arr,则返回False
    • 在字典中取出以 arr[i]为key的索引位置piecedict[arr[i]],找到pieces[piecedict[arr[i]]]的一维数组p
    • 判断 arr[i:i+len(p)] 与 p不相等时,则返回False
    • arr 索引位置i,向右移动len(p)长度
    • 直到遍历完arr,则结果返回True
    class Solution(object):
        def canFormArray(self, arr, pieces):
            """
            :type arr: List[int]
            :type pieces: List[List[int]]
            :rtype: bool
            """
            piecedict = {}
            for j in range(len(pieces)):
                piecedict[pieces[j][0]] = j
            i = 0
            while i < len(arr):
                if arr[i] not in piecedict:
                    return False
                p = pieces[piecedict[arr[i]]]
                if arr[i:i+len(p)] != p:
                    return False
                i +=len(p)
            return True
    

三、总结:

本题是一道关于索引排序的问题,当数组中的元素是唯一的,我们看可以考虑使用哈希表方法提前存储,在后续查找过程中,直接就可以拿来使用,AC提交记录如下:

image.png

  • 时间复杂度:O(n),n为arr数组长度
  • 空间复杂度:O(n),需要使用哈希表

以上是本期内容,欢迎大佬们点赞评论,下期见~~~