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
posted @ 2020-12-04 10:30  老鼠司令  阅读(133)  评论(0编辑  收藏  举报