def find_duplicate(nums):
slow=fast=nums[0]
while True:
slow=nums[slow]; fast=nums[nums[fast]]
if slow==fast: break
slow=nums[0]
while slow!=fast: slow=nums[slow]; fast=nums[fast]
return slow
public int findDuplicate(int[] nums){
int slow=nums[0],fast=nums[0];
do{slow=nums[slow];fast=nums[nums[fast]];}while(slow!=fast);
slow=nums[0];
while(slow!=fast){slow=nums[slow];fast=nums[fast];}
return slow;
}
Floyd's cycle. Java do-while vs Python while True+break.
def find_duplicate(nums):
slow=fast=nums[0]
while True:
slow=nums[slow]; fast=nums[nums[fast]]
if slow==fast: break
slow=nums[0]
while slow!=fast: slow=nums[slow]; fast=nums[fast]
return slow
public int findDuplicate(int[] nums){
int slow=nums[0],fast=nums[0];
do{slow=nums[slow];fast=nums[nums[fast]];}while(slow!=fast);
slow=nums[0];
while(slow!=fast){slow=nums[slow];fast=nums[fast];}
return slow;
}
1. Find cycle meeting point 2. Find cycle start