寻找重复数

63 阅读1分钟

// 寻找重复数  
// 输入:nums = [1,3,4,2,2]  
// 输出:2  
// 链表的环,重复元素为环的起点  
  
// 2(a+b)=a+b+kL  
// a起点到环口的距离  
// b环口到相遇点的距离  
// l环的长度  
// 慢指针a+b  
// 快指针2*(a+b)= a+b+kl  
// a=(kl-b=c)  
// 慢指针走a,快指针走c相遇  
  
public static int findDuplicate(int[] nums){  
    int slow=0;  
    int fast=0;  
    slow=nums[slow];  
    fast=nums[nums[fast]];  
    // 在环上相遇,找到相遇点,快指针=2倍的慢指针  
    while (slow!=fast){  
        slow=nums[slow];  
        fast=nums[nums[fast]];  
    }  
    // 第一次相遇的点到环口的距离=慢指针从起点到环口的距离。相同速度在相遇即是重复元素  
    int pre1=0;  
    int pre2=slow;  
    while (pre1!=pre2){  
        pre1=nums[pre1];  
        pre2=nums[pre2];  
    }  
    return pre1;  
}