当前位置: 首页 > news >正文

【BFS专题】— 解决拓扑排序问题

拓扑排序介绍:

1、课程表 - 力扣(LeetCode)

思路:

  1. 通过Map<Integer, List<Integer>> 来创建邻接图,数组来表示入度
  2. 然后遍历课程数组,建图
  3. 然后再拓扑排序,bfs
  4. 最后在遍历入度数组,判断有没有环,即是不是入度都为零
  5. 代码:
    class Solution {public boolean canFinish(int n, int[][] p) {//1、准备工作//统计每个顶点的如度int[] in = new int[n];//构造邻接图表Map<Integer, List<Integer>> edges = new HashMap<>();//2、建图for(int i = 0; i < p.length; i++){int a = p[i][0];int b = p[i][1];if(!edges.containsKey(b)){edges.put(b, new ArrayList<>());}edges.get(b).add(a);//入度加一in[a]++;}//3、拓扑排序//先把入度为零的点加入到对列中Queue<Integer> q = new LinkedList<>();for(int i = 0; i < n; i++){if(in[i] == 0){q.offer(i);}}//bfswhile(!q.isEmpty()){int t = q.poll();for(int a : edges.getOrDefault(t, new ArrayList<>())){in[a]--;if(in[a] == 0){q.offer(a);}}}//4、判断是否有环for(int x : in){if(x != 0){return false;}}return true;}
    }

2、课程表 II - 力扣(LeetCode) 

思路:

  1. 和上一题一样,把最后出队的元素加入到数组中即可
  2. 代码:
    public int[] findOrder(int n, int[][] p) {//准备工作List<List<Integer>> edges = new ArrayList<>();int[] in = new int[n];for(int i = 0; i < n; i++){edges.add(new ArrayList<>());}//建图for(int i = 0; i < p.length; i++){int a = p[i][0];int b = p[i][1];edges.get(b).add(a);in[a]++;}//拓扑排序//入度为0 的点入队Queue<Integer> q = new LinkedList<>();for(int i = 0; i < n; i++){if(in[i] == 0){q.add(i);}}//bfsint[] ret = new int[n];int index = 0;while(!q.isEmpty()){int t = q.poll();ret[index++] = t;for(int a : edges.get(t)){in[a]--;if(in[a] == 0){q.add(a);}}}//判断if(index == n){return ret;}else{return new int[0];}}

3、 火星词典 - 力扣(LeetCode)

思路:

  1. 拓扑排序
    建图:用Map<Character, Set<Character>>
    统计入度:Map<Character, Integer>
  2. 细节问题:当第一组的字符串长度大于第二组的字符串时,不合法
  3. 代码:
    class Solution {Map<Character, Set<Character>> edges = new HashMap<>();//邻接表Map<Character, Integer> in = new HashMap<>();//统计每个节点的入度boolean check;public String alienOrder(String[] words) {//1、初始化入度的哈希表和建邻接表for(String s : words){for(int i = 0; i < s.length(); i++){char ch = s.charAt(i);in.put(ch, 0);}}int n = words.length;for(int i = 0; i < n; i++){for(int j = i + 1; j < n; j++){add(words[i],words[j]);if(check == true){return "";}}}//2、拓扑排序Queue<Character> q = new LinkedList<>();//将入度为零的节点都入队for(char ch : in.keySet()){if(in.get(ch) == 0){q.offer(ch);}}StringBuffer ret = new StringBuffer();//遍历队列while(!q.isEmpty()){char t = q.poll();ret.append(t);if(!edges.containsKey(t)){continue;}for(char ch : edges.get(t)){in.put(ch, in.get(ch) - 1);if(in.get(ch) == 0){q.add(ch);}}}//3、判断,是否入度都是为零for(char ch : in.keySet()){if(in.get(ch) != 0){return "";}}return ret.toString();}//处理字符串public void add(String s1, String s2){int n = Math.min(s1.length(), s2.length());int i = 0;for( ; i < n; i++){char c1 = s1.charAt(i);char c2 = s2.charAt(i);if(c1 != c2){if(!edges.containsKey(c1)){edges.put(c1, new HashSet<>());}if(!edges.get(c1).contains(c2)){edges.get(c1).add(c2);in.put(c2, in.get(c2)+1);}break;}}if(i == s2.length() && i < s1.length()){check = true;}}
    }

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 合宙Air201模组LuatOS:PWRKEY控制,一键解决解决关机难问题
  • 数据权限的设计与实现系列9——前端筛选器组件Everright-filter集成框架开发2
  • TCP套接字【网络】
  • zabbix之钉钉告警
  • 【Qnx】使用ClockCycles完成计时功能
  • 零拷贝技术在现代编程语言和中间件中的应用
  • ROS 编程入门的介绍
  • LabVIEW 可以同时支持脚本编程和图形编程
  • 细胞分裂检测系统源码分享
  • 在线包装盒型生成工具,各种异型包装盒型,PDF导出方便
  • Edegex Foundry docker和源码安装
  • 快速入门Vue
  • 系统架构设计师:系统架构设计
  • 深入理解Redis:缓存穿透、缓存击穿、缓存雪崩及双写一致性
  • 一些学习three的小记录
  • (三)从jvm层面了解线程的启动和停止
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • HashMap ConcurrentHashMap
  • JAVA_NIO系列——Channel和Buffer详解
  • JavaScript类型识别
  • maya建模与骨骼动画快速实现人工鱼
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • TypeScript实现数据结构(一)栈,队列,链表
  • vue 配置sass、scss全局变量
  • vue中实现单选
  • 给新手的新浪微博 SDK 集成教程【一】
  • 技术发展面试
  • 理清楚Vue的结构
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 入门级的git使用指北
  • 写代码的正确姿势
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • raise 与 raise ... from 的区别
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • #Z0458. 树的中心2
  • #数据结构 笔记三
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (ibm)Java 语言的 XPath API
  • (二)c52学习之旅-简单了解单片机
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (十三)MipMap
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • (一)认识微服务
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • **CI中自动类加载的用法总结
  • .NET : 在VS2008中计算代码度量值
  • .NET Core中如何集成RabbitMQ
  • .net refrector
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .Net6使用WebSocket与前端进行通信