LeetCode 1640 Check Array Formation Through Concatenation (Easy)

You are given an array of distinct integers arr and an array of integer arrays pieces, where the integers in pieces are distinct. Your goal is to form arr by concatenating the arrays in pieces in any order. However, you are not allowed to reorder the integers in each array pieces[i].

Return true if it is possible to form the array arr from pieces. Otherwise, return false.

 

Example 1:

Input: arr = [85], pieces = [[85]]
Output: true

Example 2:

Input: arr = [15,88], pieces = [[88],[15]]
Output: true
Explanation: Concatenate [15] then [88]

Example 3:

Input: arr = [49,18,16], pieces = [[16,18,49]]
Output: false
Explanation: Even though the numbers match, we cannot reorder pieces[0].

Example 4:

Input: arr = [91,4,64,78], pieces = [[78],[4,64],[91]]
Output: true
Explanation: Concatenate [91] then [4,64] then [78]

Example 5:

Input: arr = [1,3,5,7], pieces = [[2,4,6,8]]
Output: false

 

Constraints:

  • 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
  • The integers in arr are distinct.
  • The integers in pieces are distinct (i.e., If we flatten pieces in a 1D array, all the integers in this array are distinct).
 方法:hashmap 思路:注意题目中指出每一个Integer不管是在arr或是在piece中都是distinct的。我们可以先用一个map来储存piece中每一个数字所对应的数组的位置。比如在example4中,我们可以形成这么一个map:{78:0, 4:1, 64:1, 91:2}. 然后对arr 进行遍历,得到arr中每一个数字在pieces中所对应的数组编号。同样以example4为例,我们可以得到这么一个关于position的数组=> [2, 1, 1,1 0]。然后所需要做的就是比较这个position和pieces。 time complexity:O(n) space complexity:O(n)  
class Solution:
    def canFormArray(self, arr: List[int], pieces: List[List[int]]) -> bool:
        pos = {}
        
        for i in range(len(pieces)):
            piece = pieces[i]
            for p in piece:
                pos[p] = i 
                
        arr_pos = []
        
        for a in arr:
            if a not in pos:
                return False 
            arr_pos.append(pos[a])
            
        l = 0 
        r = 0 
      # print(arr_pos)
       # print(pos)
        while l <= r and r < len(pieces):
            while r < len(arr_pos) and arr_pos[r] == arr_pos[l]:
                r += 1 
                
            p = arr_pos[l]
            if pieces[p] == arr[l:r]:
                l = r 
            else:
               
                return False 
           
        
        return True 
            

 

方法二:是在方法一的基础上稍微进行优化。在用hashmap的时候,与其记录每一个数字的情况,我们可以用每一个数组的第一个数字为key,相对应的数组为value。所以在example4中,形成的hashmap为{78:[78], 4:[4, 64], 91:[91]}. 

class Solution:
    def canFormArray(self, arr: List[int], pieces: List[List[int]]) -> bool:
        mp = {x[0]: x for x in pieces}
        res = []
        
       
        
        for num in arr:
            res += mp.get(num, [])
        
        return res == arr
            

 

上一篇:mysql从5.6升级到5.7后出现 Expression #1 of ORDER BY clause is not in SELECT list,this is incompatible with


下一篇:06数据查询