题目地址:

https://leetcode.com/problems/sequence-reconstruction/

给定一个int数组AAA,再给定一个含有很多int序列的list,问AAA是否是list里所有序列的唯一父序列(序列ppp是序列qqq的父序列的含义是qqq是ppp子序列)。若不是父序列或者父序列不唯一都返回false。

可以用图论建模,将list里所有序列里的数抽象成顶点,如果某个序列里一个数aaa紧接着出现在另一个数bbb之前,那么就在aaa到bbb连一条边a→ba\to ba→b。这样,题目就转化为,判断AAA是否是这个有向图的唯一的拓扑排序。

拓扑排序可以用BFS来完成,基本流程是先用邻接表建图,顺便将每个顶点的入度求出来,然后开一个队列,将入度为000的顶点入队,每次从队中出数之前都要判断一下队列是否只有一个元素,若不然,则队列里的几个元素在拓扑排序中的顺序可以交换,所以拓扑排序不唯一,直接返回false;否则就将这个元素出队,并将这个元素的邻居的入度都减掉111,然后再把入度为000的点再入队,重复以上操作。最后判断一下拓扑排序的结果和AAA是否相同即可。代码如下:

import java.util.*;public class Solution {public boolean sequenceReconstruction(int[] org, List<List<Integer>> seqs) {if (seqs == null || seqs.isEmpty()) {return false;}// indegrees存每个顶点的入度,key代表顶点编号,value代表入度Map<Integer, Integer> indegrees = new HashMap<>();// buildGraph函数用邻接表建图,并计算了每个顶点的入度存进了indegreesMap<Integer, List<Integer>> graph = buildGraph(seqs, indegrees);Queue<Integer> queue = new LinkedList<>();// 将入度为0的顶点入队for (Map.Entry<Integer, Integer> entry : indegrees.entrySet()) {if (entry.getValue() == 0) {queue.offer(entry.getKey());}}// 如果顶点数已经与序列长度不等了,那么org要么不是父序列,要么数字多了,不是最短的父序列,直接返回falseif (org.length != indegrees.size()) {return false;}// 接下来进行拓扑排序,并将结果存进resList<Integer> res = new ArrayList<>();while (!queue.isEmpty()) {// 如果队列元素个数超过了1,说明拓扑排序不唯一,直接返回falseif (queue.size() != 1) {return false;}int cur = queue.poll();res.add(cur);if (graph.containsKey(cur)) {for (int next : graph.get(cur)) {indegrees.put(next, indegrees.get(next) - 1);if (indegrees.get(next) == 0) {queue.offer(next);}}}}// 如果拓扑排序的结果和org长度不等,要么说明有环,不存在拓扑排序,要么说明org并不是拓扑排序;// 两种情况都返回falseif (org.length != res.size()) {return false;}// 接下来将拓扑排序结果与org比对,如果对不上则直接返回falsefor (int i = 0; i < org.length; i++) {if (org[i] != res.get(i)) {return false;}}return true;}private Map<Integer, List<Integer>> buildGraph(List<List<Integer>> seqs, Map<Integer, Integer> indegrees) {Map<Integer, List<Integer>> graph = new HashMap<>();for (List<Integer> seq : seqs) {// 一定要判断一下序列长度是否为1,如果是1,下面for循环进不去,但还是要记录一下入度为0if (seq.size() == 1) {indegrees.putIfAbsent(seq.get(0), 0);}for (int i = 0; i < seq.size() - 1; i++) {graph.putIfAbsent(seq.get(i), new ArrayList<>());graph.get(seq.get(i)).add(seq.get(i + 1));indegrees.put(seq.get(i + 1), indegrees.getOrDefault(seq.get(i + 1), 0) + 1);}}return graph;}
}

时空复杂度O(∑i=1kni)O(\sum_{i=1}^{k}n_i)O(∑i=1k​ni​),其中nin_ini​表示seqs里的每个序列的长度。

【Leetcode】444. Sequence Reconstruction相关推荐

  1. 【Leetcode】100. 相同的树

    题目 给定两个二叉树,编写一个函数来检验它们是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. 示例 1: 输入: 1 1/ \ / \2 3 2 3[1,2,3], [1 ...

  2. 【leetcode】85. Maximal Rectangle 0/1矩阵的最大全1子矩阵

    1. 题目 Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1 ...

  3. 【leetcode】486. Predict the Winner

    题目如下: Given an array of scores that are non-negative integers. Player 1 picks one of the numbers fro ...

  4. 【leetcode】132. Palindrome Partitioning II

    题目如下: 解题思路:本题是[leetcode]131. Palindrome Partitioning的升级版,要求的是求出最小cuts,如果用[leetcode]131. Palindrome P ...

  5. 【leetcode】86. Partition List

    题目如下: Given a linked list and a value x, partition it such that all nodes less than x come before no ...

  6. 【Leetcode】103. 二叉树的锯齿形层次遍历

    题目 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 ...

  7. 【Leetcode】79.单词搜索

    题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格 ...

  8. 【leetcode】 算法题1 两数之和

    [leetcode] 算法题1 两数之和 问题   给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums ...

  9. 【Leetcode】62. 不同路径

    题目 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为&qu ...

最新文章

  1. Mysql服务器问题(2013.3.5日发现)
  2. 一个简单RPC框架是怎样炼成的(II)——制定RPC消息
  3. windows清理图标缓存并重新加载
  4. Java集合篇:HashMap 与 ConcurrentHashMap 原理总结
  5. 如何写出高性能SQL语句
  6. PHP上传图片到数据库,并进行显示
  7. 实时录制视频,实时去除人_录制实时演示,第2部分:软件设置
  8. Java中Comparable接口与Comparator接口
  9. 15.分布式文档系统-document id的手动指定与自动生成两种方式解析
  10. ARP表项的创建与更新
  11. TSC打印机,使用java打印二维码
  12. 【CocosCreator】单机游戏存档的常用加密解密方法
  13. 《相关性准则——大数据时代的高效能之道》一一1.6 相关性准则
  14. 图 2021-01-16
  15. iOS:quartz2D绘图(绘制渐变图形)
  16. ESP32 TM1637显示4位数码管
  17. ACM必学知识点清单
  18. Oracle的表结构:纵向和横向
  19. COMSOL光学模块/FDTD时域有限差分/ RSoft光电器件设计
  20. Flash拖拽元件的元件+元件的元件随鼠标移动:目的让元件的元件随着鼠标移动

热门文章

  1. 【成员故事】CSDN杨东杰:生态运营需要一个自己的圈子
  2. 第一次安装mysql怎么样启动_CentOS第一次安装MySQL的完整步骤
  3. 元宇宙技术在职业教育示范性虚拟仿真实训基地建设项目上的前景展望
  4. GGDH模型计算浮升力生成项
  5. Unity 报错处理
  6. Locust 压力测试工具学习(一)
  7. uniapp实现点击加载更多
  8. 黄金矿工两百行基于Easyx
  9. php返回json数组前面出现乱码“锘縶”解决办法
  10. 【CTF】【渗透】【msf】三、绕过杀毒软件技巧