LeetCode每日一题——1640. 能否连接形成数组

简介: 如果可以连接 pieces 中的数组形成 arr ,返回 true ;否则,返回 false 。

题目

给你一个整数数组 arr ,数组中的每个整数 互不相同 。另有一个由整数数组构成的数组 pieces,其中的整数也 互不相同 。请你以 任意顺序 连接 pieces 中的数组以形成 arr 。但是,不允许 对每个数组 pieces[i] 中的整数重新排序。

如果可以连接 pieces 中的数组形成 arr ,返回 true ;否则,返回 false 。

示例

示例 1:

输入:arr = [15,88], pieces = [[88],[15]]

输出:true

解释:依次连接 [15] 和 [88]

示例 2:

输入:arr = [49,18,16], pieces = [[16,18,49]]

输出:false

解释:即便数字相符,也不能重新排列 pieces[0]

示例 3:

输入:arr = [91,4,64,78],

pieces = [[78],[4,64],[91]]

输出:true 解释:依次连接 [91]、[4,64] 和 [78]

提示:

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 扁平化成一维数组,数组中的所有整数互不相同)

思路

index表示arr的下标指针,暴力搜索每个pieces中的开头,如果相等则设另一指针指向pieces中的这个元素,二者同时向后比,比到末尾二者都相等时,index变为index+这个元素的长度,重复即可。这里需要建立哈希表来去重,pieces中的下标如果记录过,那么将直接跳过,不再判断,全部比较完成后即可返回True。如果扫描过一遍pieces发现没有开头元素等于arr[index],则直接返回False

题解

class Solution:
    def canFormArray(self, arr: List[int], pieces: List[List[int]]) -> bool:
      # arr下标,哈希表去重
        index, tmp = 0, set()
        while index <= len(arr)-1:
          # 记录当前下标index,如果比较一遍pieces之后不变则直接返回
            tmp_index = index
            for i in range(len(pieces)):
              # 为判断过
                if i not in tmp:
                    if arr[index] == pieces[i][0]:
                        judge = True
                        index_ = index
                        # 双指针判断是否全部相等
                        for j in range(1, len(pieces[i])):
                            index_ = index + j
                            if arr[index_] == pieces[i][j]:
                                continue
                            else:
                                judge = False
                                break
                        # 修改index,加入哈希表
                        if judge:
                            tmp.add(i)
                            index = index_ + 1
            # index不变,直接返回
            if tmp_index == index:
                return False    
        return True
目录
相关文章
|
3月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
49 0
|
5月前
|
算法
LeetCode第53题最大子数组和
LeetCode第53题"最大子数组和"的解题方法,利用动态规划思想,通过一次遍历数组,维护到当前元素为止的最大子数组和,有效避免了复杂度更高的暴力解法。
LeetCode第53题最大子数组和
LeetCode------找到所有数组中消失的数字(6)【数组】
这篇文章介绍了LeetCode上的"找到所有数组中消失的数字"问题,提供了一种解法,通过两次遍历来找出所有未在数组中出现的数字:第一次遍历将数组中的每个数字对应位置的值增加数组长度,第二次遍历找出所有未被增加的数字,即缺失的数字。
|
3月前
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
27 4
|
3月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
26 0
Leetcode第三十三题(搜索旋转排序数组)
|
3月前
|
算法 C++
Leetcode第53题(最大子数组和)
这篇文章介绍了LeetCode第53题“最大子数组和”的动态规划解法,提供了详细的状态转移方程和C++代码实现,并讨论了其他算法如贪心、分治、改进动态规划和分块累计法。
79 0
|
3月前
|
C++
【LeetCode 12】349.两个数组的交集
【LeetCode 12】349.两个数组的交集
25 0
|
5月前
|
算法
LeetCode第81题搜索旋转排序数组 II
文章讲解了LeetCode第81题"搜索旋转排序数组 II"的解法,通过二分查找算法并加入去重逻辑来解决在旋转且含有重复元素的数组中搜索特定值的问题。
LeetCode第81题搜索旋转排序数组 II
|
5月前
|
算法 索引
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
这篇文章介绍了LeetCode第34题"在排序数组中查找元素的第一个和最后一个位置"的解题方法,通过使用双指针法从数组两端向中间同时查找目标值,有效地找到了目标值的首次和最后一次出现的索引位置。
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
|
5月前
|
算法
LeetCode第33题搜索旋转排序数组
这篇文章介绍了LeetCode第33题"搜索旋转排序数组"的解题方法,通过使用二分查找法并根据数组的有序性质调整搜索范围,实现了时间复杂度为O(log n)的高效搜索算法。
LeetCode第33题搜索旋转排序数组