描述:
Given an array nums
containing n + 1
integers where each integer is between 1
and n
(inclusive), prove that at least one duplicate number must exist. Assume that there is only one duplicate number, find the duplicate one.
注意事项
- You must not modify the array (assume the array is read only).
- You must use only constant, O(1) extra space.
- Your runtime complexity should be less than O(n^2).
- There is only one duplicate number in the array, but it could be repeated more than once.
样例:
Given nums
= [5,5,4,3,2,1]
return 5
Given nums
= [5,4,4,3,2,1]
return 4
思路:
建立i到f(A[i])的映射,会找到i!=j,而f(i)=f(j),进行环检测,查找包含重复值的循环,循环的入口即为重复值
详细证明参考:http://bookshadow.com/weblog/2015/09/28/leetcode-find-duplicate-number/
解题思路参考了此链接的博客内容
public class Solution {
/**
* @param nums an array containing n + 1 integers which is between 1 and n
* @return the duplicate one
*/
public int findDuplicate(int[] nums) {
// Write your code
int slow = 0;
int fast = 0;
while(true){
slow = nums[slow];
fast = nums[nums[fast]];
if(slow == fast){
break;
}
}
int result = 0;
while(true){
slow = nums[slow];
result = nums[result];
if(slow == result){
return result;
}
}
}
}