数组中重复的数字
方法一
利用哈希表来解决问题,从头到尾扫描数组的每个数字,每扫描一个数字,多可以用O(1)的时间来判断是否已经包含了该数。如果哈希表中没有这个数,就把这个数加入哈希表中,有的话返回结果,这种算法的时间复杂度是O(n)但他的空间复杂度是O(n),因为他需要消耗一个大小为O(n)的哈希表。
代码:
import java.util.*;
class Solution {
public int findRepeatNumber(int[] nums) {
HashSet<Integer> set = new HashSet<Integer>();
int res = -1;
for (int i = 0; i < nums.length; i++) {
if (!set.contains(nums[i])) {
set.add(nums[i]);
}
else {
res = nums[i];
return res;
}
}
return res;
}
}
方法二:
因为该数组的数字的范围是0~n-1,所以如果该数组不重复的话就是每个位置对应一个数。
我们遍历该数组。
如果当前数组的值nums[i]等于位置i,则继续往下走。
①如果当前数组的值nums[i]不等于位置i,则应该把该值放到合适的位置,也就是nums[nums[i]];
②放到合适位置的过程中如果nums[nums[i]] = nums[i]则找到了重复值。
③如果不相等,则更换两个数的位置。
如果更换后当前的nums[i]还是不等于位置i,则继续①②③。
代码:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6G4FCHW5-1624503201690)(C:\Users\try\AppData\Roaming\Typora\typora-user-images\image-20210624104226699.png)]
从上面的运行结果可以看出,我上面的代码运行超时了。但只要把nums[i] 用temp代替就能解决。
class Solution {
public int findRepeatNumber(int[] nums) {
int res = -1;
int i = 0;
while (i < nums.length) {
if (nums[i] == i) {
i++;
continue;
}
else if (nums[nums[i]] == nums[i]) {
return nums[i];
}
else {
int temp = nums[i];
nums[i] = nums[temp];
nums[temp] = temp;
}
}
return res;
}
}
这个问题目前我还没有解决,应该涉及数组底层原理。