持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目提示
- 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提交记录如下:
- 时间复杂度:O(n),n为arr数组长度
- 空间复杂度:O(n),需要使用哈希表
以上是本期内容,欢迎大佬们点赞评论,下期见~~~