寻找重复数
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。
说明:
不能更改原数组(假设数组是只读的)。
只能使用额外的 O(1) 的空间。
时间复杂度小于 O(n^2) 。
数组中只有一个重复的数字,但它可能不止重复出现一次。
思路:
法1:
我的思路是先排序,然后使用快慢指针,时间和空间复杂度都能够满足,但是改变了原数组。
public static int findDuplicate(int[] nums) {
Arrays.sort(nums);
int i=0,c=nums[0];
for (int j=1;j<nums.length;j++){
if (nums[i]!=nums[j])
i++;
else {
c=nums[i];
break;
}
}
return c;
}
法2:
在数组上迭代时存储每个元素,这样就可以在迭代时简单地检查每个元素。
为了实现线性时间复杂性,可以在迭代数组时把每个元素插入set集合seen中,并在每次迭代时检查集合seen中是否包含重复的那个数字。
public static int findDuplicate(int[] nums) {
Set<Integer> seen = new HashSet<Integer>();
for (int num : nums){
if (seen.contains(num)){
return num;
}
seen.add(num);
}
return -1;
}