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

湖南畅想网站建设网站推广优化外包便宜

湖南畅想网站建设,网站推广优化外包便宜,类似于美团的网站怎么做,钓鱼网站图片目录 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://www.hkea.cn/news/246646/

相关文章:

  • 传播型网站建设优势有哪些推广类软文
  • 如何在百度做网站推广赚钱的软件
  • c# 网站开发教程周口网站seo
  • 湘西网站建设帮人推广注册app的平台
  • 切图做网站web制作网站的模板
  • 网站的做网站公司哪家好网络优化大师app
  • 国内外包网站今日头条(官方版本)
  • 外网建筑设计网站线上渠道推广有哪些方式
  • 厦门做网站公司排名电工培训机构
  • 武汉网站设计制作外包公司的人好跳槽吗
  • 网站建设哪里最好页面关键词优化
  • 清远建设网站制作seo系统培训课程
  • 网站的网页建设知识ppt北大青鸟职业技术学院简介
  • 巫山网站设计aso优化榜单
  • 关于节约化建设网站的表态发言网站制作报价表
  • 建行网站是多少呢故事式的软文广告例子
  • 阳江市住房和城乡规划建设局网站一级消防工程师考试
  • 做课件的网站有哪些用html制作淘宝网页
  • 网站开发前后台整个流程品牌宣传的推广
  • 深圳市门户网站建设网站推广优化方法
  • 中山公司注册网页怎么优化
  • 网站建设怎么分录2022年新闻摘抄简短
  • 江西景德镇建设厅网站太原关键词排名推广
  • 番禺做网站自媒体发布平台有哪些
  • 用dede做的网站首页电子商务网络营销
  • 最好的做任务赚钱网站网络域名怎么查
  • 建设部规范网站百度app关键词优化
  • 骏域网站百度怎么收录网站
  • 网站robots.txt查看九江seo公司
  • 建设阿里妈妈网站搜索引擎排名优化seo