题目:
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.
Note:
- 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(n2)
. - There is only one duplicate number in the array, but it could be repeated more than once.
Credits:
Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.
class Solution {
public int findDuplicate(int[] nums) {
//给定从1-n的数组,其中有一个重复数组,找出该重复数组
//思路:由于不能改变位置,只能通过查找对应元素和其下标是否相等,不相等则与该元素值所对应的下标里的值对比
//(类似交换,最终元素对应其对应位置,重复的元素最终找不到其对应的位置)
//要求:只能使用一个额外空间,不能改动原数组元素的位置
int low=nums[0];
int high=nums[nums[0]];
//查找不对应的元素
while(low!=high){
//类似交换
low=nums[low];
high=nums[nums[high]];
}
high=0;
while(low!=high){
high=nums[high];
low=nums[low];
}
return high;
}
}