首页 > 其他分享 >剑指offer115:重建序列

剑指offer115:重建序列

时间:2022-12-13 11:35:32浏览次数:42  
标签:offer115 get int seqs num 序列 org 重建


题目:
请判断原始的序列 org 是否可以从序列集 seqs 中唯一地 重建 。
序列 org 是 1 到 n 整数的排列,其中 1 ≤ n ≤ 104。重建 是指在序列集 seqs 中构建最短的公共超序列,即 seqs 中的任意序列都是该最短序列的子序列。
示例 1:
输入: org = [1,2,3], seqs = [[1,2],[1,3]]
输出: false
解释:[1,2,3] 不是可以被重建的唯一的序列,因为 [1,3,2] 也是一个合法的序列。
示例 2:
输入: org = [1,2,3], seqs = [[1,2]]
输出: false
解释:可以重建的序列只有 [1,2]。
示例 3:
输入: org = [1,2,3], seqs = [[1,2],[1,3],[2,3]]
输出: true
解释:序列 [1,2], [1,3] 和 [2,3] 可以被唯一地重建为原始的序列 [1,2,3]。
示例 4:
输入: org = [4,1,5,2,6,3], seqs = [[5,2,6,3],[4,1,5,2]]
输出: true
分析:
广度优先搜索外加拓扑排序,广度优先要用到队列,如果队列中出现两个元素就证明org不是唯一的,所以队列最多只要求有一个元素,有向图以邻接表的形式用HashMap类型的graph保存,同时统计每个节点的入度并保存到另一个HashMap类型的inDefrees中。

代码:

package com.kuang;

import java.util.*;
import java.util.stream.Stream;

public class SequenceReconstruction {
public boolean sequenceReconstruction(int[] org, List<List<Integer>> seqs) {
Map<Integer, Set<Integer>> graph = new HashMap<>();
Map<Integer, Integer> inDegrees = new HashMap<>();
for (List<Integer> seq: seqs){
for (int num : seq) {
if (num < 1 || num > org.length){
return false;
}
graph.putIfAbsent(num,new HashSet<>());
inDegrees.putIfAbsent(num,0);
}
for (int i = 0; i < seq.size() - 1; i++) {
int num1 = seq.get(i);
int num2 = seq.get(i+1);
if (!graph.get(num1).contains(num2)){
graph.get(num1).add(num2);
inDegrees.put(num2,inDegrees.get(num2)+1);
}
}
}
Queue<Integer> queue = new LinkedList<>();
for (int num : inDegrees.keySet()) {
if (inDegrees.get(num) == 0){
queue.add(num);
}
}
// 用来和org比较是否相等
List<Integer> built = new LinkedList<>();
// 队列中元素如果数量大于1,就证明一定不是唯一的,返回false就完了
while (queue.size() ==1){
int num = queue.remove();
built.add(num);
for (int next : graph.get(num)){
inDegrees.put(next,inDegrees.get(next)-1);
if (inDegrees.get(next) == 0){
queue.add(next);
}
}
}
int[] result = built.stream().mapToInt(a -> a).toArray();
return Arrays.equals(org,result);
}
}

剑指offer115:重建序列_拓扑排序


标签:offer115,get,int,seqs,num,序列,org,重建
From: https://blog.51cto.com/u_15911055/5933484

相关文章

  • 序列化
     1.例子intmain(intargc,char*argv[]){usingnamespacex;Personp;p.set_name("tom");p.set_id(88);p.set_email("[email protected]");......
  • [java安全基础 01]SQL+反序列化
    tomcatServlet什么是servletJavaServlet是运行在Web服务器或应用服务器上的程序.它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间......
  • day35_0106.从中序与后序遍历序列构造二叉树0105. 前序+中序构造二叉树
    0106.从中序与后序遍历序列构造二叉树前序+中序构造二叉树[106中序+后序构造二叉树]做过简答题但没编过代码以下均是复制粘贴递归代码的思路----三部曲......
  • 数字序列中某一位的数字(找规律)
    ​​面试题44.数字序列中某一位的数字​​难度中等32数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位......
  • leetcode 128 最长连续序列(hash)
    ​​128.最长连续序列​​难度困难437给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。示例:输入: [100,4,200,1,3,2]输出:4解......
  • leetcode 128. 最长连续序列 (hash,暴力)
    题目大意:给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。解题思路:我们每次枚举数字的第一个,然后往后数有多少个。可以证明每个数字只会被......
  • 剑指offer 序列化二叉树
    题目描述请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可......
  • Django自带的序列化组件
    Django自带的序列化组件(为drf做铺垫)(drf:djangorestframework)#在前端获取到,后端用户表里所有的数据,并且是列表套字典的格式#views.pyfromdjango.httpimport......
  • 深度学习笔记 第五门课 序列模型 第二周 自然语言处理与词嵌入
    本文是吴恩达老师的深度学习课程[1]笔记部分。作者:黄海广[2]主要编写人员:黄海广、林兴木(第四所有底稿,第五课第一二周,第三周前三节)、祝彦森:(第三课所有底稿)、贺志尧(第五课第......
  • LC1220 统计元音字母序列的数目
    1220.统计元音字母序列的数目my动规的五步:定义;推导公式;初始化;遍历顺序;打表验证定义的思考角度一开始我的想法是:f[i][j],以第i个字母为结尾的长度为j的字符串的数目......