一、题目描述
二、思路分析
方法 1:暴力法
这个没啥好说的,测试直接运行超时。
方法 2:用哈希表去重
利用哈希表的特性,遍历数组。当哈希表中没有重复的数组元素时,将元素加入到哈希表中,否则返回重复元素。
方法 3:原地置换法
由于数组元素的特殊性,所有的元素大小范围在 0~n-1之间(n 是数组长度)。可以知道,如果不存在重复元素,数组下标的位置和元素是一一对应的。因此,我们通过遍历数组,当数组元素不在它对应的位置时,如果此时该位置的元素和当前遍历的数组元素相同,返回当前数组元素即可。否则将当前遍历数组元素和在数组此下标的元素交换位置
三、题解
- 方法 2:采用哈希表去重
class Solution {
public int findRepeatNumber(int[] nums) {
Set<Integer> set = new HashSet<>();
for(int i = 0; i < nums.length; i++) {
if (set.contains(nums[i])) {
return nums[i];
}
set.add(nums[i]);
}
return -1;
}
}
- 方法 3:原地置换法
class Solution {
public int findRepeatNumber(int[] nums) {
for(int i = 0; i < nums.length; i++) {
while (nums[i] != i) {
// 当前遍历数组元素与它对应的数组下标位置的元素重复
if (nums[i] == nums[nums[i]]) {
return nums[i];
}
// 交换位置
int tmp = nums[i];
nums[i] = nums[tmp];
nums[tmp] = tmp;
}
}
return -1;
}
}