
LeetCode:1640. 能否连接形成数组!!!
初始化动态规划数组:创建一个长度为 处理边界情况:如果目标数组 填充动态规划数组:对于每一个位置 返回结果:最后检查 初始化: 遍历每个位置:对于每个位置 检查每个数组:对于 返回结果:最终检查
发布日期:2021-05-08 02:38:11
浏览次数:12
分类:精选文章
本文共 1227 字,大约阅读时间需要 4 分钟。
为了解决这个问题,我们需要判断是否可以通过连接给定的整数数组 pieces
中的数组,按照任意顺序,以形成目标数组 arr
。每个 pieces
中的数组必须保持原有的顺序,不能重新排列。
方法思路
我们可以使用动态规划的方法来解决这个问题。具体步骤如下:
n+1
的数组 dp
,其中 dp[i]
表示处理到 arr
的第 i
个元素是否可以成功分解。arr
为空,则直接返回 True
。i
,如果 dp[i]
为 True
,则检查 pieces
中的每个数组 p
,看是否可以从 arr[i]
开始匹配。如果匹配成功,则更新 dp[i + len(p)]
为 True
。dp[n]
是否为 True
,即是否成功分解整个 arr
。这种方法确保了我们能够以任意顺序连接 pieces
中的数组,同时保持每个数组的内部顺序不变。
解决代码
from typing import Listclass Solution: def canFormArray(self, arr: List[int], pieces: List[List[int]]) -> bool: n = len(arr) if n == 0: return True m = len(pieces) dp = [False] * (n + 1) dp[0] = True for i in range(n): if not dp[i]: continue for p in pieces: if p[0] == arr[i]: k = len(p) if i + k <= n and not dp[i + k]: dp[i + k] = True return dp[n]
代码解释
dp
数组的长度为 n + 1
,并将 dp[0]
初始化为 True
,表示处理到第一个元素的位置。i
,如果 dp[i]
为 True
,则继续处理。pieces
中的每个数组 p
,检查其第一个元素是否等于 arr[i]
。如果匹配,更新 dp
数组中的相应位置。dp[n]
是否为 True
,即是否能够完全分解 arr
。这种方法的时间复杂度是 O(n * m)
,其中 n
是 arr
的长度,m
是 pieces
的长度,能够高效处理题目中的约束条件。
发表评论
最新留言
很好
[***.229.124.182]2025年03月22日 00时43分39秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
使用BAT批处理 匹配查找指定文件夹,并在当文件夹下创建空文件
2019-03-05
wxpython的Hello,World代码探索
2019-03-05
IDEA出现错误:找不到或无法加载主类 io.xxx.XXXApplication
2019-03-05
【数字图像处理】OpenCV3 学习笔记
2019-03-05
【单片机开发】智能小车工程(经验总结)
2019-03-05
【单片机开发】基于stm32的掌上游戏机设计 (项目规划)
2019-03-05
【单片机开发】基于stm32的掌上游戏机设计(终章)
2019-03-05
PHP编译步骤参考和FASTCGI方式(PHP-FPM)配置PHP
2019-03-05
iptables NAT表之SNAT、DNAT、REDIRECT介绍
2019-03-05
KeepAlived介绍、配置示例、KeepAlived配置IPVS、调用脚本进行监控
2019-03-05
【Numpy学习】np.count_nonzero()用法解析
2019-03-05
Scala集合-数组、元组
2019-03-05
Flink Standalone集群安装和部署
2019-03-05
JAVA网络爬虫01-http client爬取网络内容
2019-03-05
04 程序流程控制
2019-03-05
java并发编程(1)
2019-03-05
C++&&STL
2019-03-05
双指针算法思想
2019-03-05
分组背包问题
2019-03-05