题目来源
题目描述
class Solution {
public:
bool sequenceReconstruction(vector<int>& nums, vector<vector<int>>& sequences) {
}
};
题目解析
分析
样例一:
nums = [1,2,3], sequences = [[1,2],[1,3]]
- 样例一中,我们已知排列[1, 2, 3]的两个子序列[1, 2]和[1, 3]。这就说明:1必须出现在2的前面并且1必须出现在3的前面。(因为子序列中元素相对位置必须保持不变)
- 但是2和3哪个在前哪个在后呢?根据给定输入[[1,2],[1,3]]无法判断。
- 因此,样例一不能唯一确定“超序列”
样例二:
nums = [1,2,3], sequences = [[1,2],[1,3],[2,3]]
- 样例二中,我们已知排列[1, 2, 3]的三个子序列[1, 2]、[1, 3]和[2, 3]。这就说明1在2前、1在3前、2在3前。
- 那么要满足上述三个条件,有且仅有一种排列方式:[1, 2, 3]
- 因此样例二能唯一确定“超序列”[1, 2, 3]
思路
“1在2前、1在3前”让我们很容易想到拓扑排序。
我们可以构建一张图,图中节点是nums中的每一个元素。如果1在2前就添加一条1→2的边。
那么样例一的图将被构建为:
- 从入度为0的节点1开始进行拓扑排序,排序之后发现剩下两个节点,彼此之间无法确定相对顺序。
样例二的图将被构建为:
- 从入度为0的节点1开始进行拓扑排序,排序之后只剩下了最终节点3
sequences 是怎么表示的
- 上图可以用序列1表示:sequences= [[1,2], [1,3], [2,3]],序列2表示:sequences = [[3,2,1], [2,4], [1,4]]