Floyd判圈算法

对于一个有环的链表,我们可以通过把他的各个值打一个hash来判重,但是有的时候,空间上往往不允许我们这样做。

为此我们可以使用FLoyd判圈算法(又称:龟兔赛跑算法),即选定一个起点,然后让两个值分别迭代,一个每次“跑”一次,另一个“跑”两次,只要跑道有环,它们就一定可以相遇。

这样就把空间复杂度压到了O(1)

以UVa - 11549为例:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>

#define rep(i,x,y) for (int i=x;i<=y;i++)
#define dep(i,y,x) for (int i=y;i>=x;i--)
#define read(x) scanf("%lld",&x)

using namespace std;

long long n,a,b,t,up,k,ans;

int next(long long n,long long k)
{
 long long l=k*k;
 
 while (l>=up) l/=10;

 return l;
}

int main()
{
 read(t);
 while (t--)
 {
  scanf("%lld%lld",&n,&k);
  
  up=1;
  rep(i,1,n) up*=10;

  if (!k) {printf("%d\n",0);continue;}

  
  a=k;
  b=next(n,k);

  ans=max(a,b);

  while (a!=b)
  {
   a=next(n,a); //走一步
   b=next(n,b); ans=max(b,ans); //走一步
   b=next(n,b); ans=max(b,ans); //再走一步
  }
  printf("%lld\n",ans);
 }
 return 0;
}
posted @ 2016-04-01 21:46  Krew  阅读(135)  评论(0编辑  收藏  举报