class Solution {
    public int findDuplicate(int[] nums) {
        // 1.二分查找 计算数组中小于等于该元素数量的个数,如果数量 > 该元素的值,说明,重复元素在l,元素区间内
        // 2.Floyd判圈算法
        // 快慢指针找相遇点 慢指针一次走一步,快指针一次走两步
        // 然后将其中一个指针移动到出发点
        // 两个指针的相遇点即为所求
        // 可以以i->nums[i]构建链表,有重复数字,说明有环
        int low = 0, high = nums.length -1;
        while (low < high) {
            int mid = low + (high - low) / 2;
            int count = 0;
            for (int i = 0; i < nums.length ; i++) {
                if (nums[i] <= mid) {
                    count++;
                }
            }
            if (count <= mid) {
                low = mid + 1;
            } else {
                high = mid ;
            }
        }
        return low;
    //    int slow = nums[0];
    //    int fast = nums[nums[0]];
    //    while (slow != fast) {
    //         slow = nums[slow];
    //         fast = nums[nums[fast]];
    //    }
    //    fast = 0;
    //    while (slow != fast) {
    //         slow = nums[slow];
    //         fast = nums[fast];
    //    }
    //    return fast;
    }
}