LeetCode #1640. Check Array Formation Through Concatenation
题目
1640. Check Array Formation Through Concatenation
解题方法
当arr不为空时,寻找arr中第一个位置的元素在pieces中是否是一个列表的第一个元素,如果不是直接返回False,如果是就把这个列表的索引记录下来,之后从arr的第一个位置开始和这个列表进行对照,如果数字不相同也返回False,否则就把列表和arr中两两重复的元素都删除掉,把空列表用索引直接pop去除,直到arr为空,这时返回True。
时间复杂度:O(n^2)
空间复杂度:O(1)
值得注意的是,这里我的方法有一些可以改进的地方,比如在查找pieces数组以寻找开头元素是否为arr第一个元素时,可以先给pieces排序再使用二分查找,这样就是O(nlogn)时间复杂。如果想要更进一步减少时间复杂,可以用一个字典把pieces中的首位都存起来,然后直接用in就可以做了,但这样做空间复杂会增加到O(n)。两种改进都比较基础,就不再加代码了。
代码
class Solution:
def canFormArray(self, arr: List[int], pieces: List[List[int]]) -> bool:
while arr:
pieceind = 0
for i in range(len(pieces)):
if pieces[i][0] == arr[0]:
pieceind = i
break
else:
return False
while pieces[pieceind]:
if pieces[pieceind][0] == arr[0]:
arr.pop(0)
pieces[pieceind].pop(0)
else:
return False
else:
pieces.pop(pieceind)
return True