路程

55-链表中环的入口节点

你。 提交于 2020-01-28 12:50:50
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 假设x为环前面的路程(黑色路程),a为环入口到相遇点的路程(蓝色路程,假设顺时针走), c为环的长度(蓝色+橙色路程) 当快慢指针相遇的时候: 此时慢指针走的路程为Sslow = x + m * c + a 快指针走的路程为Sfast = x + n * c + a 2 Sslow = Sfast 2 * ( x + m*c + a ) = (x + n *c + a) 从而可以推导出: x = (n - 2 * m )*c - a = (n - 2 *m -1 )*c + c - a 即环前面的路程 = 数个环的长度(为可能为0) + c - a 什么是c - a?这是相遇点后,环后面部分的路程。(橙色路程) 所以,我们可以让一个指针从起点A开始走,让一个指针从相遇点B开始继续往后走, 2个指针速度一样,那么,当从原点的指针走到环入口点的时候(此时刚好走了x) 从相遇点开始走的那个指针也一定刚好到达环入口点。 所以2者会相遇,且恰好相遇在环的入口点。 最后,判断是否有环,且找环的算法复杂度为: 时间复杂度:O(n) 空间复杂度:O(1) /*function ListNode(x){ this.val = x; this.next = null; }*/ function EntryNodeOfLoop

链表中环的入口结点

断了今生、忘了曾经 提交于 2020-01-23 14:03:26
题目:链表中环的入口结点 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 思路: 入环前路程为a,入环点到相遇点距离b,相遇点到入环点距离c。一个快指针fast,每次走2步,一个慢指针,每次走1步; 快指针路程=a+(b+c)k+b ,k>=1 其中b+c为环的长度,k为绕环的圈数(k>=1,即最少一圈,不能是0圈,不然和慢指针走的一样长,矛盾)。 慢指针路程=a+b 快指针走的路程是慢指针的两倍,所以: (a+b)*2=a+(b+c)k+b 化简可得: a=(k-1)(b+c)+c 这个式子的意思是: 链表头到环入口的距离=相遇点到环入口的距离+(k-1)圈环长度 。其中k>=1,所以 k-1>=0 圈。所以两个指针分别从链表头和相遇点出发,最后一定相遇于环入口。 #include<iostream> #include<vector> #include<stack> using namespace std; struct ListNode{ int val; ListNode *next; ListNode(int x): val(x),next(NULL){} }; class Solution { public: ListNode* EntryNodeOfLoop(ListNode* pHead) { ListNode *fast

[啊哈算法]Floyd-Warshall

北战南征 提交于 2020-01-16 06:45:59
问题描述 Input 第一行四个数为n,m,n表示顶点个数,m表示边的条数。 接下来m行,每一行有三个数t1、t2 和t3,表示顶点t1到顶点t2的路程是t3。请注意这些t1->t2是单向的。 Output 输出一个n*n的矩阵,第n行第n列表示定点n到n的距离。每一行两个数间由空格隔开 Sample Input 5 8 1 2 2 2 3 3 3 4 4 4 5 5 5 3 3 3 1 4 2 5 7 1 5 10 Sample Output 0 2 5 9 9 7 0 3 7 7 4 6 0 4 9 12 14 8 0 5 7 9 3 7 0 More Info 输出结果每行的最后一个数字后不需要留空格哦~ 算法思想 当任意两点之间不允许经过第三个点时,这些城市之间最短路程就是初始路程。 假如现在只允许经过1号顶点,求任意两点之间的最短路程,应该如何求呢?只需判断e[i][1]+e[1][j]是否比e[i][j]要小即可。e[i][j]表示的是从i号顶点到j号顶点之间的路程。e[i][1]+e[1][j]表示的是从i号顶点先到1号顶点,再从1号顶点到j号顶点的路程之和。其中i是1~n循环,j也是1~n循环,代码实现如下 for ( i = 1 ; i <= n ; i ++ ) { for ( j = 1 ; j <= n ; j ++ ) { if ( e [ i ] [ j

数学建模方法-Floyd算法

匿名 (未验证) 提交于 2019-12-03 00:41:02
一、引言   哈喽大家好,今天要给大家讲的是 Floyd 算法。在那之前,大家还记得我们上一章讲的内容吗,就是那个 Dijkstra 算法,用来解决从 A 点到 B 点的最短路径问题。我们还给出了 Matlab 代码。 Floyd 算法也是用来处理最短路径问题的。它的理念跟 Dijkstra 有点不一样,但是最终的结果是一样的。 Floyd 算法主要是用到了 动态规划 的思想。在这里博主不打算讲到很抽象很高深的东西(毕竟博主也不是专业的),仅仅通过比较通俗易懂的方式来给大家讲解这个算法的思想( 如果有问题大家帮忙指出来哈 )。本文的图片和思想,借用了 (图片画得好好,有谁知道是用什么软件画的吗,博主也想学一学)。本篇的主要思想来自那篇博文,因此会有很多类似的,但博主还是想以自己的理解来解释Floyd算法的理念。好了我们开始吧... 二、 Floyd 算法   首先,大家看上面的图,暑假,小哼准备去一些城市旅游。有些城市之间有公路,有些城市之间则没有。为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程。我们用 1-4 来表示 4 个地点,并用 箭头 和箭头上的 数字 来表示一个地点到另一个地点的距离(注意,有些路是单向的)。这样就得到下图   现在,我们希望能求解出任意两点的最短路径及其距离。   好了,为了求解这个问题,我们先用一个二维的数组 A

链表中环的入口结点 -python

心不动则不痛 提交于 2019-11-27 00:51:41
思路:转自https://www.nowcoder.com/questionTerminal/253d2c59ec3e4bc68da16833f79a38e4 链接: https://www.nowcoder.com/questionTerminal/253d2c59ec3e4bc68da16833f79a38e4 来源:牛客网 假设x为环前面的路程(黑色路程),a为环入口到相遇点的路程(蓝色路程,假设顺时针走), c为环的长度(蓝色+橙色路程) 当快慢指针相遇的时候: 此时慢指针走的路程为Sslow = x + m * c + a 快指针走的路程为Sfast = x + n * c + a 2 Sslow = Sfast 2 * ( x + m c + a ) = (x + n c + a) 从而可以推导出: x = (n - 2 * m ) c - a = (n - 2 m -1 )*c + c - a 即环前面的路程 = 数个环的长度(为可能为0) + c - a 什么是c - a?这是相遇点后,环后面部分的路程。(橙色路程) 所以,我们可以让一个指针从起点A开始走,让一个指针从相遇点B开始继续往后走, 2个指针速度一样,那么,当从原点的指针走到环入口点的时候(此时刚好走了x) 从相遇点开始走的那个指针也一定刚好到达环入口点。 所以2者会相遇,且恰好相遇在环的入口点。 最后