leetcode:444. 序列重建

题目来源

题目描述

在这里插入图片描述

在这里插入图片描述

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]]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值