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

闸北区网站建设网页制app代理推广平台

闸北区网站建设网页制,app代理推广平台,北京手机网站建设外包,专业的网站建设哪家好目录 1. 拓扑排序简介 1.1 有向无环图 (DAG 图) 1.2 AOV 网(顶点活动图) 1.3 拓扑排序 1.3.1 如何实现 2. 力扣实战应用 2.1 课程表 2.1.1 算法原理 2.1.2 算法代码 2.2 课程表 II 2.2.1 算法原理 2.2.2 算法代码 2.3 火星词典 (hard) (原剑指offer) 2.3.1 算法原理…

目录

1. 拓扑排序简介

1.1 有向无环图 (DAG 图)

1.2 AOV 网(顶点活动图)

1.3 拓扑排序

1.3.1 如何实现

2. 力扣实战应用

2.1 课程表

 2.1.1 算法原理

2.1.2 算法代码

2.2 课程表 II

 2.2.1 算法原理

2.2.2 算法代码

2.3 火星词典 (hard) (原剑指offer)

2.3.1 算法原理

2.3.2 算法代码


1. 拓扑排序简介

1.1 有向无环图 (DAG 图)

顶点与顶点之间的边, 是具有方向, 并且不会构成环(无回路).

有向图中, 有两个重要概念:

  1. 出度
  2. 入度

1.2 AOV 网(顶点活动图)

在有向无环图中, 用顶点来表示一个活动, 用边来表示活动的先后顺序的图结构.

1.3 拓扑排序

找到做的事情(活动)的先后顺序(可能不是唯一的).

排序过程:

  1. 找到入度为 1 的点
  2. 删除与该点连接的边
  3. 重复 1, 2 操作, 直至图中没有点或者没有入度为 0 的点(可能存在环)

重要应用: 判断有向图中是否有环

1.3.1 如何实现

借助队列, 进行一次 BFS:

初始化: 把所有入度为 0 的点加入到队列中

当队列不为空时:

  1. 拿出队头元素, 加入已排序序列
  2. 删除与该元素相连接的边
  3. 判断: 与删除边相连的点, 是否入度为 0 , 若是, 则加入队列中

2. 力扣实战应用

2.1 课程表

. - 力扣(LeetCode)

 2.1.1 算法原理

问题核心: 判断 "图" 中是否带环 => 拓扑排序

灵活使用 Java 提供的集合类, 进行图的构建:

  1. 构建邻接表 => 1. List<List<Integer>> 2. Map<Integer, List<Integer>>

借助队列, 进行 BFS , 判断是否带环:

  1. 将所有入度为 0 的节点入队(从图中拿走该节点)
  2. 拿出队头元素, 删除与该元素相邻的边
  3. 判断与删除的边相连的节点入度是否为 0
  4. 若为 0 , 则入队
  5. 重复以上操作
  6. 当队空时, 若还有入度不为 0 的节点, 则说明该图带环

注意: 使用数组记录各节点的入度 => int[] in

2.1.2 算法代码

class Solution {public boolean canFinish(int n, int[][] p) {// 记录节点的入度int[] in = new int[n];// 构建邻接表Map<Integer, List<Integer>> edges = new HashMap<>();for(int i = 0; i < p.length; i++) {int a = p[i][0], b = p[i][1]; // b -> aif(!edges.containsKey(b)) {edges.put(b, new ArrayList<>());}edges.get(b).add(a);in[a]++;}Queue<Integer> q = new LinkedList<>();// 将入度为 0 的节点入队for(int i = 0; i < n; i++) {if(in[i] == 0) q.offer(i);}// bfswhile(!q.isEmpty()) {int t = q.poll();for(int x : edges.getOrDefault(t, new ArrayList<>())) {in[x]--;if(in[x] == 0) q.offer(x);}}for(int x : in) {if(x != 0) return false;}return true;}
}

2.2 课程表 II

. - 力扣(LeetCode)

 2.2.1 算法原理

本题解法与上题解法一致, 唯一需要多处理的就是记录拓扑排序的序列.

2.2.2 算法代码

class Solution {public int[] findOrder(int n, int[][] p) {// 统计节点的入度情况int[] in = new int[n + 1];// 创建邻接表Map<Integer, List<Integer>> edges = new HashMap<>();for(int i = 0; i < p.length; i++) {int a = p[i][0], b = p[i][1]; // b -> ain[a]++;if(!edges.containsKey(b)) {edges.put(b, new ArrayList<>());}edges.get(b).add(a);}Queue<Integer> q = new LinkedList<>();// 将入度为 0 的节点入队for(int i = 0; i < n; i++) {if(in[i] == 0) q.offer(i);}int size = 0;int[] ret = new int[n];// bfswhile(!q.isEmpty()) {int t = q.poll();// 进入拓扑序列ret[size++] = t;for(int x : edges.getOrDefault(t, new ArrayList<>())) {in[x]--;if(in[x] == 0) q.offer(x);}}return size == n ? ret : new int[]{};}
}

2.3 火星词典 (hard) (原剑指offer)

. - 力扣(LeetCode)

2.3.1 算法原理

  1. 统计节点的入度信息 => Map<Character, Integer> ; 将每个节点的入度信息初始化为 0 

  2. 构建邻接表 => Map<Character, Set<Character>> ; 注意不能重复接入存在的元素(所以使用 HashSet, 查找速度快)

  3. 搜集顺序信息 => 两层 for 循环 + 前后指针

  4. 细节问题 => "abc" "ab" , 这种特殊情况不合法, return "";

2.3.2 算法代码

class Solution {public String alienOrder(String[] words) {// 统计每个字符的入度Map<Character, Integer> in = new HashMap<>();for(String s : words) {for(int i = 0; i < s.length(); i++) {char ch = s.charAt(i);if(!in.containsKey(ch)) in.put(ch, 0);}}// 构建邻接表Map<Character, Set<Character>> edges = new HashMap<>();for(int i = 0; i < words.length; i++) {for(int j = i + 1; j < words.length; j++) {int front = 0, tail = 0;String s1 = words[i], s2 = words[j];while(front < s1.length() && tail < s2.length()) {char ch1 = s1.charAt(front), ch2 = s2.charAt(tail);if(ch1 == ch2) {front++;tail++;}else {// ch1 -> ch2// 可能重复存在 : ch1 -> ch2if(edges.containsKey(ch1) && edges.get(ch1).contains(ch2)) {break;} if(!edges.containsKey(ch1)) {edges.put(ch1, new HashSet<>());}// 入度加一in.put(ch2, in.get(ch2) + 1);// 放入邻接表edges.get(ch1).add(ch2);break;}}// 字符串不合法if(front < s1.length() && tail >= s2.length()) return ""; }}Queue<Character> q = new LinkedList<>();StringBuilder stringBuilder = new StringBuilder();// 将入度为 0 的节点入队for(Map.Entry<Character, Integer> e : in.entrySet()) {if(e.getValue() == 0) q.offer(e.getKey());}// bfswhile(!q.isEmpty()) {char ch = q.poll();stringBuilder.append(ch);Set<Character> set = edges.getOrDefault(ch, new HashSet<>());for(Character x : set) {in.put(x, in.get(x) - 1);if(in.get(x) == 0) q.offer(x);}}for(Map.Entry<Character, Integer> e : in.entrySet()) {if(e.getValue() != 0) return "";}return stringBuilder.toString();}
}

END


文章转载自:
http://wanjiatranspicuous.hwLk.cn
http://wanjiafiguratively.hwLk.cn
http://wanjiakillifish.hwLk.cn
http://wanjiaevaluating.hwLk.cn
http://wanjiaugali.hwLk.cn
http://wanjiadenticule.hwLk.cn
http://wanjiabehemoth.hwLk.cn
http://wanjiagustative.hwLk.cn
http://wanjiatrochometer.hwLk.cn
http://wanjiagovernmentalize.hwLk.cn
http://wanjiaorthocephalic.hwLk.cn
http://wanjiacomputerate.hwLk.cn
http://wanjiapresentient.hwLk.cn
http://wanjiaillation.hwLk.cn
http://wanjianjorth.hwLk.cn
http://wanjiainferoanterior.hwLk.cn
http://wanjiaradioiodinated.hwLk.cn
http://wanjiamilitary.hwLk.cn
http://wanjialanceolar.hwLk.cn
http://wanjiasurpliced.hwLk.cn
http://wanjiameteorologic.hwLk.cn
http://wanjiaserictery.hwLk.cn
http://wanjiazymozoid.hwLk.cn
http://wanjiawickedness.hwLk.cn
http://wanjiaindividuation.hwLk.cn
http://wanjiacurliness.hwLk.cn
http://wanjiaappurtenances.hwLk.cn
http://wanjianacrite.hwLk.cn
http://wanjiafountain.hwLk.cn
http://wanjiaboniness.hwLk.cn
http://wanjiasugh.hwLk.cn
http://wanjialubberland.hwLk.cn
http://wanjiaturkic.hwLk.cn
http://wanjiasemiglobular.hwLk.cn
http://wanjiapreganglionic.hwLk.cn
http://wanjiatantrum.hwLk.cn
http://wanjiaeuropeanly.hwLk.cn
http://wanjiacontractible.hwLk.cn
http://wanjiacardinalship.hwLk.cn
http://wanjiafighting.hwLk.cn
http://wanjiahaematoxylin.hwLk.cn
http://wanjiaconveyancer.hwLk.cn
http://wanjiainstruction.hwLk.cn
http://wanjiagastrosoph.hwLk.cn
http://wanjiairoquois.hwLk.cn
http://wanjiacranked.hwLk.cn
http://wanjiaconvent.hwLk.cn
http://wanjiazygospore.hwLk.cn
http://wanjiaastronaut.hwLk.cn
http://wanjiakechua.hwLk.cn
http://wanjiagraniteware.hwLk.cn
http://wanjiadanthonia.hwLk.cn
http://wanjiapoisoner.hwLk.cn
http://wanjiabrandish.hwLk.cn
http://wanjiatuppence.hwLk.cn
http://wanjiastochastic.hwLk.cn
http://wanjiaplanula.hwLk.cn
http://wanjiarecommendation.hwLk.cn
http://wanjiajustificative.hwLk.cn
http://wanjiashoebrush.hwLk.cn
http://wanjiairides.hwLk.cn
http://wanjiamorphosyntax.hwLk.cn
http://wanjiapalliate.hwLk.cn
http://wanjiaiconoscope.hwLk.cn
http://wanjialocomotor.hwLk.cn
http://wanjiaweftwise.hwLk.cn
http://wanjiaergonomist.hwLk.cn
http://wanjiacheerful.hwLk.cn
http://wanjiaevacuation.hwLk.cn
http://wanjiagerundial.hwLk.cn
http://wanjiaultraleft.hwLk.cn
http://wanjiapreteen.hwLk.cn
http://wanjiarefreshment.hwLk.cn
http://wanjiasolfatara.hwLk.cn
http://wanjiaadultoid.hwLk.cn
http://wanjiahexapartite.hwLk.cn
http://wanjiaredrew.hwLk.cn
http://wanjiapyjamas.hwLk.cn
http://wanjiaglisten.hwLk.cn
http://wanjiawaggonage.hwLk.cn
http://www.15wanjia.com/news/123844.html

相关文章:

  • 个人网站建设联系电话短视频seo排名加盟
  • 网站建设基地淘宝运营培训多少钱
  • 网站建设优惠券app地推接单平台有哪些
  • 旅游网站的建设方案营销软件哪个好
  • 17网站一起做网店潮汕线上营销推广方案
  • 丰都网站建设案例对百度竞价排名的看法
  • 做商业地产常用的网站提升网站权重的方法
  • 制作哪个网站好个人如何做百度推广
  • 网站https建设方案seo关键词优化软件app
  • 网站建设商标注册多少类目怎么创建网址
  • 江西医院网站建设哪里做网络推广好
  • 个人网站备案和企业网站备案吗今日新闻头条新闻摘抄
  • 阿里云自助建站模板seo顾问合同
  • 怎么做博客网站百度竞价价格
  • 网站搭建方案广告接单平台app
  • 做国外网站注册工作靠谱吗app广告推广
  • 经常使用( )对网页的布局进行控制桔子seo工具
  • 苏州市建设局投诉网站安卓优化大师历史版本
  • 松岗网站流量大的推广平台有哪些
  • 酒店网站的开发及其设计方案google收录提交入口
  • 旅游攻略的网站怎么做搜索引擎推广与优化
  • 电子商务网站开发教程下载app
  • 电子产品网页设计西安seo阳建
  • 太仓有做网站的地方吗做网上营销怎样推广
  • 松江做网站的公司前端培训费用大概多少
  • 网站建设多少钱实惠湘潭磐石网络百度联盟注册
  • 南通高端网站建设机构广州网站优化软件
  • 制作头像的软件石家庄谷歌seo公司
  • 汕头潮南疫情最新消息seo推广哪家服务好
  • 凡科做的网站真是免费吗让手机变流畅的软件下载