[2016-03-19][判断循环-Floyd判圈算法]

[2016-03-19][判断循环-Floyd判圈算法]

Floyd判圈算法的思路

  • 设置两个指针,一个快指针,一个慢指针,快指针每次走两步,慢指针每次走一步,如果快指针能和慢指针相遇,则存在环,,如果快指针先到达终点,则不存在环
    1. LL x1,x2,v = 0;
    2. x1 = x2 = 1; //开头值为1,初始化
    3. do{
    4. x1 = nxt(x1);
    5. x2 = nxt(nxt(x2));
    6. ++v; //记录步骤
    7. }while(v<= limit && x1 != x2); //超出范围或者有圈

Floyd判圈算法的作用

  • 判断是否有环,见上面

  • 确定环的起点

    • 在确定有环的情况下,把其中一个指针指向开头,然后两个指针同时移动,每次移动一步,再次相遇的地点就是循环的起点
      1. x1 = 1;v = 0; //以0开头
      2. while (x1 != x2){
      3. x1 = nxt(x1);
      4. x2 = nxt(x2);
      5. ++v;
      6. }
  • 确定环的长度

    • 在确定起点之后,直接再跑一圈就可以确定
    • 或者两个指针在起点同时移动,一个每次一步,一个每次两步,再次相遇的时候,快的比慢的多跑一圈,位置之差就是循环节长度
      1. LL u = 1;
      2. x1 = nxt(x1);
      3. while(u + v <= limit && x1 != x2){
      4. x1 = nxt(x1);
      5. ++u;
      6. }


来自为知笔记(Wiz)


posted on 2016-03-25 20:49  红洋  阅读(153)  评论(0)    收藏  举报

导航