题目描述

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

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

示例 1:

1
2
3
输入:arr = [15,88], pieces = [[88],[15]]
输出:true
解释:依次连接 [15] 和 [88]

示例 2:

1
2
3
输入:arr = [49,18,16], pieces = [[16,18,49]]
输出:false
解释:即便数字相符,也不能重新排列 pieces[0]

示例 3:

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

来源:力扣(LeetCode)

题解

模拟

根据题意分析,只要判断 pieces 同一数组中的元素在 arr 中是否连续即可。

1
2
3
4
5
6
7
8
9
10
11
public boolean canFormArray(int[] arr, int[][] pieces) {
for (int i = 0; i < pieces.length; i++) {
int j = 0;
while (j < arr.length && arr[j] != pieces[i][0]) j++;
if (arr.length - j < pieces[i].length) return false;
for (int k = 0; k < pieces[i].length; j++, k++) {
if (arr[j] != pieces[i][k]) return false;
}
}
return true;
}

可以发现,算法中不断寻找 pieces 各个数组的 首元素arr 中出现的位置,所以我们可以使用 哈希表 来简化操作。

  • 时间复杂度: O(n^2)
  • 空间复杂度: O(1)

submissions-2022092201

哈希表

因为 pieces 中的整数 互不相同,所以可以使用哈希表记录 pieces 各个数组的 首元素 与数组下标的对应关系。而 1 <= arr[i], pieces[i] [j] <= 100,可以使用 数组 模拟哈希表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public boolean canFormArray(int[] arr, int[][] pieces) {
// 数组模拟哈希表
int[] index = new int[110];
// 记录 pieces 各个数组的首元素与数组下标的对应关系
for (int i = 0; i < pieces.length; i++) {
index[pieces[i][0]] = i;
}
for (int i = 0; i < arr.length; ) {
int j = index[arr[i]];
for (int k = 0; k < pieces[j].length; k++) {
// 不需要判断 i + k 是否越界.
// 如果 i + k == arr.length - 1, 而 k 远远小于 pieces[j].length, 这意味着 pieces[j] 中有若干元素未处理.
// 而 sum(pieces[i].length) == arr.length, 则说明有元素必定在 arr[i + k] 之前出现过, 且不是 pieces 数组的头元素, 在进入循环的第一时间就会返回 false
// if (i + k >= arr.length) return false;
// 如果 pieces 数组中的元素不是在 arr 中连续, 则返回 false
if (arr[i + k] != pieces[j][k]) return false;
}
i += pieces[j].length;
}
return true;
}
  • 时间复杂度: O(n)
  • 空间复杂度: O(n)

submissions-2022092202

参考资料

__END__