1940. 排序数组之间的最长公共子序列 🔒
题目描述
给定一个由整数数组组成的数组 arrays
,其中 arrays[i]
是 严格递增 排序的,返回一个 所有 数组均包含的 最长公共子序列 的整数数组。
子序列 是从另一个序列派生出来的序列,删除一些元素或不删除任何元素,而不改变其余元素的顺序。
示例1:
输入: arrays = [[1,3,4], [1,4,7,9]] 输出: [1,4] 解释: 这两个数组中的最长子序列是[1,4]。
示例 2:
输入: arrays = [[2,3,6,8], [1,2,3,5,6,7,10], [2,3,4,6,9]] 输出: [2,3,6] 解释: 这三个数组中的最长子序列是 [2,3,6]。
示例 3:
输入: arrays = [[1,2,3,4,5], [6,7,8]] 输出: [] 解释: 这两个数组之间没有公共子序列。
限制条件:
2 <= arrays.length <= 100
1 <= arrays[i].length <= 100
1 <= arrays[i][j] <= 100
arrays[i]
是严格递增排序.
解法
方法一:计数
我们注意到,元素的范围是 \([1, 100]\),我们可以用一个长度为 \(101\) 的数组 \(\textit{cnt}\) 来记录每个元素出现的次数。
由于数组 \(\textit{arrays}\) 中的每个数组都是严格递增排序的,因此,公共子序列的元素必然是单调递增,并且这些元素的出现次数都等于 \(\textit{arrays}\) 的长度。
因此,我们可以遍历 \(\textit{arrays}\) 中的每个数组,统计每个元素的出现次数,最后,从小到大遍历 \(\textit{cnt}\) 的每个元素,如果出现次数等于 \(\textit{arrays}\) 的长度,那么这个元素就是公共子序列的元素之一,我们将其加入答案数组中。
遍历结束后,返回答案数组即可。
时间复杂度 \(O(M + N)\),空间复杂度 \(O(M)\)。其中 \(M\) 为元素的范围,本题中 \(M = 101\),而 \(N\) 为数组所有元素的个数。
1 2 3 4 5 6 7 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|