class Solution {
public int findDuplicate(int[] nums) {
int n = nums.length;
int l = 1, r = n - 1;
while(l < r){
int count = 0;
int mid = (l + r) / 2;
for(int i = 0; i < n; i++){
if(nums[i] <= mid){
count++;
}
}
if(count > mid){
r = mid;
}else{
l = mid + 1;
}
}
return l;
}
}
class Solution {
public int findDuplicate(int[] nums) {
int slow = 0, fast = 0;
while(true){
slow = nums[slow];
fast = nums[nums[fast]];
if(slow == fast){
break;
}
}
slow = 0;
while(slow != fast){
slow = nums[slow];
fast = nums[fast];
}
return slow;
}
}