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

宝宝投票网站怎么做网站首页添加代码

宝宝投票网站怎么做,网站首页添加代码,平台设计公司,成都网站建设思乐科技公司一、题目 现在你总共有numCourses门课需要选#xff0c;记为0到numCourses - 1。给你一个数组prerequisites#xff0c;其中prerequisites[i] [ai, bi]#xff0c;表示在选修课程ai前 必须 先选修bi。 例如#xff0c;想要学习课程0#xff0c;你需要先完成课程1#x…一、题目 现在你总共有numCourses门课需要选记为0到numCourses - 1。给你一个数组prerequisites其中prerequisites[i] [ai, bi]表示在选修课程ai前 必须 先选修bi。 例如想要学习课程0你需要先完成课程1我们用一个匹配来表示[0,1]。 返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序你只要返回 任意一种 就可以了。如果不可能完成所有课程返回 一个空数组 。 示例 1 输入numCourses 2, prerequisites [[1,0]] 输出[0,1] 解释总共有2门课程。要学习课程1你需要先完成课程0。因此正确的课程顺序为[0,1]。 示例 2 输入numCourses 4, prerequisites [[1,0],[2,0],[3,1],[3,2]] 输出[0,2,1,3] 解释总共有4门课程。要学习课程3你应该先完成课程1和课程2。并且课程1和课程2都应该排在课程0之后。 因此一个正确的课程顺序是[0,1,2,3]。另一个正确的排序是[0,2,1,3]。 示例 3 输入numCourses 1, prerequisites [] 输出[0] 1 numCourses 2000 0 prerequisites.length numCourses * (numCourses - 1) prerequisites[i].length 2 0 ai, bi numCourses ai ! bi 所有[ai, bi]互不相同 二、代码 给定一个包含n个节点的有向图G我们给出它的节点编号的一种排列如果满足 对于图G中的任意一条有向边(u,v)u在排列中都出现在v的前面。 那么称该排列是图G的「拓扑排序」。根据上述的定义我们可以得出两个结论 1、如果图G中存在环即图G不是「有向无环图」那么图G不存在拓扑排序。这是因为假设图中存在环x1,x2,⋯ ,xn,x1​那么x1在排列中必须出现在xn的前面但xn同时也必须出现在x1的前面因此不存在一个满足要求的排列也就不存在拓扑排序 2、如果图G是有向无环图那么它的拓扑排序可能不止一种。举一个最极端的例子如果图G值包含n个节点却没有任何边那么任意一种编号的排列都可以作为拓扑排序。 有了上述的简单分析我们就可以将本题建模成一个求拓扑排序的问题了 1、我们将每一门课看成一个节点 2、如果想要学习课程A之前必须完成课程B那么我们从B到A连接一条有向边。这样以来在拓扑排序中B一定出现在A的前面。 求出该图的拓扑排序就可以得到一种符合要求的课程学习顺序。下面介绍两种求解拓扑排序的方法。 【1】深度优先搜索 我们可以将深度优先搜索的流程与拓扑排序的求解联系起来用一个栈来存储所有已经搜索完成的节点。 对于一个节点u如果它的所有相邻节点都已经搜索完成那么在搜索回溯到u的时候u本身也会变成一个已经搜索完成的节点。这里的「相邻节点」指的是从u出发通过一条有向边可以到达的所有节点。 假设我们当前搜索到了节点u如果它的所有相邻节点都已经搜索完成那么这些节点都已经在栈中了此时我们就可以把u入栈。可以发现如果我们从栈顶往栈底的顺序看由于u处于栈顶的位置那么u出现在所有u的相邻节点的前面。因此对于u这个节点而言它是满足拓扑排序的要求的。 这样以来我们对图进行一遍深度优先搜索。当每个节点进行回溯的时候我们把该节点放入栈中。最终从栈顶到栈底的序列就是一种拓扑排序。 算法 对于图中的任意一个节点它在搜索的过程中有三种状态即 1、「未搜索」我们还没有搜索到这个节点 2、「搜索中」我们搜索过这个节点但还没有回溯到该节点即该节点还没有入栈还有相邻的节点没有搜索完成 3、「已完成」我们搜索过并且回溯过这个节点即该节点已经入栈并且所有该节点的相邻节点都出现在栈的更底部的位置满足拓扑排序的要求。 通过上述的三种状态我们就可以给出使用深度优先搜索得到拓扑排序的算法流程在每一轮的搜索搜索开始时我们任取一个「未搜索」的节点开始进行深度优先搜索。 1、我们将当前搜索的节点u标记为「搜索中」遍历该节点的每一个相邻节点v   ■ 如果v为「未搜索」那么我们开始搜索v待搜索完成回溯到u   ■ 如果v为「搜索中」那么我们就找到了图中的一个环因此是不存在拓扑排序的   ■ 如果v为「已完成」那么说明v已经在栈中了而u还不在栈中因此u无论何时入栈都不会影响到(u,v)之前的拓扑关系以及不用进行任何操作。 2、当u的所有相邻节点都为「已完成」时我们将u放入栈中并将其标记为「已完成」。 在整个深度优先搜索的过程结束后如果我们没有找到图中的环那么栈中存储这所有的n个节点从栈顶到栈底的顺序即为一种拓扑排序。 class Solution {// 存储有向图ListListInteger edges;// 标记每个节点的状态0未搜索1搜索中2已完成int[] visited;// 用数组来模拟栈下标 n-1 为栈底0 为栈顶int[] result;// 判断有向图中是否有环boolean valid true;// 栈下标int index;public int[] findOrder(int numCourses, int[][] prerequisites) {edges new ArrayListListInteger();for (int i 0; i numCourses; i) {edges.add(new ArrayListInteger());}visited new int[numCourses];result new int[numCourses];index numCourses - 1;for (int[] info : prerequisites) {edges.get(info[1]).add(info[0]);}// 每次挑选一个「未搜索」的节点开始进行深度优先搜索for (int i 0; i numCourses valid; i) {if (visited[i] 0) {dfs(i);}}if (!valid) {return new int[0];}// 如果没有环那么就有拓扑排序return result;}public void dfs(int u) {// 将节点标记为「搜索中」visited[u] 1;// 搜索其相邻节点// 只要发现有环立刻停止搜索for (int v: edges.get(u)) {// 如果「未搜索」那么搜索相邻节点if (visited[v] 0) {dfs(v);if (!valid) {return;}}// 如果「搜索中」说明找到了环else if (visited[v] 1) {valid false;return;}}// 将节点标记为「已完成」visited[u] 2;// 将节点入栈result[index--] u;} }时间复杂度: O(nm)其中n为课程数m为先修课程的要求数。这其实就是对图进行广度优先搜索的时间复杂度。 空间复杂度: O(nm)。题目中是以列表形式给出的先修课程关系为了对图进行深度优先搜索我们需要存储成邻接表的形式空间复杂度为O(nm)。在深度优先搜索的过程中我们需要最多O(n)的栈空间递归进行深度优先搜索并且还需要若干个O(n)的空间存储节点状态、最终答案等。 【2】广度优先搜索 方法一的深度优先搜索是一种「逆向思维」最先被放入栈中的节点是在拓扑排序中最后面的节点。我们也可以使用正向思维顺序地生成拓扑排序这种方法也更加直观。 我们考虑拓扑排序中最前面的节点该节点一定不会有任何入边也就是它没有任何的先修课程要求。当我们将一个节点加入答案中后我们就可以移除它的所有出边代表着它的相邻节点少了一门先修课程的要求。如果某个相邻节点变成了「没有任何入边的节点」那么就代表着这门课可以开始学习了。按照这样的流程我们不断地将没有入边的节点加入答案直到答案中包含所有的节点得到了一种拓扑排序或者不存在没有入边的节点图中包含环。 上面的想法类似于广度优先搜索因此我们可以将广度优先搜索的流程与拓扑排序的求解联系起来。 算法 我们使用一个队列来进行广度优先搜索。开始时所有入度为 000 的节点都被放入队列中它们就是可以作为拓扑排序最前面的节点并且它们之间的相对顺序是无关紧要的。 在广度优先搜索的每一步中我们取出队首的节点u 1、我们将u放入答案中 2、我们移除u的所有出边也就是将u的所有相邻节点的入度减少1。如果某个相邻节点v的入度变为0那么我们就将v放入队列中。 在广度优先搜索的过程结束后。如果答案中包含了这n个节点那么我们就找到了一种拓扑排序否则说明图中存在环也就不存在拓扑排序了。 class Solution {// 存储有向图ListListInteger edges;// 存储每个节点的入度int[] indeg;// 存储答案int[] result;// 答案下标int index;public int[] findOrder(int numCourses, int[][] prerequisites) {edges new ArrayListListInteger();for (int i 0; i numCourses; i) {edges.add(new ArrayListInteger());}indeg new int[numCourses];result new int[numCourses];index 0;for (int[] info : prerequisites) {edges.get(info[1]).add(info[0]);indeg[info[0]];}QueueInteger queue new LinkedListInteger();// 将所有入度为 0 的节点放入队列中for (int i 0; i numCourses; i) {if (indeg[i] 0) {queue.offer(i);}}while (!queue.isEmpty()) {// 从队首取出一个节点int u queue.poll();// 放入答案中result[index] u;for (int v: edges.get(u)) {--indeg[v];// 如果相邻节点 v 的入度为 0就可以选 v 对应的课程了if (indeg[v] 0) {queue.offer(v);}}}if (index ! numCourses) {return new int[0];}return result;} }时间复杂度: O(nm)其中n为课程数m为先修课程的要求数。这其实就是对图进行广度优先搜索的时间复杂度。 空间复杂度: O(nm)。题目中是以列表形式给出的先修课程关系为了对图进行深度优先搜索我们需要存储成邻接表的形式空间复杂度为O(nm)。在深度优先搜索的过程中我们需要最多O(n)的栈空间递归进行深度优先搜索并且还需要若干个O(n)的空间存储节点状态、最终答案等。
http://www.zqtcl.cn/news/177911/

相关文章:

  • 怎么把地图放到网站上如何做色流量网站
  • 常见的导航网站有哪些郑州核酸vip服务
  • 网站开发老板排名关键词优化师
  • 迈诺网站建设跨境电商平台网站建设
  • 做t恤的网站外贸仿牌网站建设
  • 网站建设的学习网站建站后维护需要做哪些
  • 为什么建设网站很多公司没有网站界面分析
  • 旅游网网站建设的管理大连淘宝网站建设
  • 无锡锡牛网站建设做汽配的外贸网站
  • 黄石公司做网站临湘做网站
  • 网站配色购物网站开发背景需求
  • 河北省建设工程教育网站如何在手机上制作app软件
  • 担保公司网站建设汇报wordpress修改默认域名
  • 网站平台建设需要多少钱html网站标题怎么做的
  • 国外的服务器网站wordpress 博客论坛
  • 多国语言网站模板修改wordpress登录密码
  • 给周杰伦做网站广州免费景点
  • 网站文章不显示淄博网站建设及托管
  • 国外免费建站平面广告设计案例
  • 微信微网站开发价格广西做网站的公司有哪些
  • 做网站内容哪家公司可以做网站
  • 网站后台数据库管理经常浏览不良网站会被记录吗
  • 做加工都在哪个网站推广网络营销外包推广
  • 做英文网站怎么赚钱经典logo设计案例分析
  • 大型建站公司是干嘛的wordpress激活码充值
  • 带后台网站模板wordpress注册模板
  • 济南城乡住房建设厅网站dedecms企业网站
  • 旅游网站怎么做才能被关注园林景观设计公司名字
  • 建站之星网站建设系统事业单位网站登录模板
  • 如何做京东优惠券网站建设银行网站储蓄账户查询密码