方法一:原地置换
1.遍历数组,找到对应索引处的值不等于索引值的数
2.判断对应索引处的值对应的索引处的值是否等于对应索引处的值(套娃,给自己看的)
3.如果等于,就重复了,把对应索引处的值直接返回
4.不等于就把两个数交换一下,继续往下判断
5.没找到就返回-1
class Solution {
public int findRepeatNumber(int[] nums) {
int tmp;
for (int i = 0; i < nums.length; i++) {
while (i != nums[i]) {
if (nums[nums[i]] == nums[i]) {
return nums[i];
}
tmp = nums[i];
nums[tmp] = tmp;
nums[i] = nums[tmp];
}
}
return -1;
}
}
时间复杂度:遍历数组O(n),遍历和判断O(1)
空间复杂度:O(1)
结果:
方法2:哈希表(set)
1.创建HashSet
2.把数组每一个加入到set中
3.加不进去说明重复了,把对应的值返回
class Solution {
public int findRepeatNumber(int[] nums) {
Set<Integer> set = new HashSet<>();
int res = -1;
for (int i = 0; i < nums.length; i++) {
if (!set.add(nums[i])) {
res = nums[i];
break;
}
}
return res;
}
}
时间复杂度:O(n)
空间复杂度:O(n)
结果: