[2016-03-19][判断循环-Floyd判圈算法]
[2016-03-19][判断循环-Floyd判圈算法]
Floyd判圈算法的思路
- 设置两个指针,一个快指针,一个慢指针,快指针每次走两步,慢指针每次走一步,如果快指针能和慢指针相遇,则存在环,,如果快指针先到达终点,则不存在环
LL x1,x2,v = 0;x1 = x2 = 1; //开头值为1,初始化do{x1 = nxt(x1);x2 = nxt(nxt(x2));++v; //记录步骤}while(v<= limit && x1 != x2); //超出范围或者有圈
Floyd判圈算法的作用
判断是否有环,见上面
确定环的起点
- 在确定有环的情况下,把其中一个指针指向开头,然后两个指针同时移动,每次移动一步,再次相遇的地点就是循环的起点
x1 = 1;v = 0; //以0开头while (x1 != x2){x1 = nxt(x1);x2 = nxt(x2);++v;}
- 在确定有环的情况下,把其中一个指针指向开头,然后两个指针同时移动,每次移动一步,再次相遇的地点就是循环的起点
确定环的长度
- 在确定起点之后,直接再跑一圈就可以确定
- 或者两个指针在起点同时移动,一个每次一步,一个每次两步,再次相遇的时候,快的比慢的多跑一圈,位置之差就是循环节长度
LL u = 1;x1 = nxt(x1);while(u + v <= limit && x1 != x2){x1 = nxt(x1);++u;}
浙公网安备 33010602011771号