Toasobi
找出数组重复的数字(简单)
本文最后更新于2023年03月03日,已超过675天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
自己写的是很简单的双层循环,这个在时间上复杂度太高,但是内存占用意外的小
看看不同的题解:
=======================
- 方法一:遍历数组
由于只需要找出数组中任意一个重复的数字,因此遍历数组,遇到重复的数字即返回。
这个也是我一开始想到的,但是不知道用什么存储比较的数字,于是便使用了双层循环
这里使用了不可重复的set集合(重复存储返回false)来存储,使用集合存储已经遇到的数字,如果遇到的一个数字已经在集合中,则当前的数字是重复数字。以空间换取时间
<div>
//哈希表实现
class Solution {
public int findRepeatNumber(int[] nums) {
Set<Integer> set = new HashSet<Integer>();
int repeat = -1;
for (int num : nums) {
if (!set.add(num)) {
repeat = num;
break;
}
}
return repeat;
}
}
//set底层就是hashmap,add调用了put方法,添加相同元素返回false,当然set.contains(num)也可以用
</div>
=======================
- 方法二:排序后判断前后位置元素是否相等
核心:
nums = Arrays.stream(nums).sorted().toArray()
<div>
class Solution {
public int findRepeatNumber(int[] nums) {
nums = Arrays.stream(nums).sorted().toArray(); //注意这一行以后的刷题可能用的比较多
for(int i = 0;i<nums.length -1; i++) {
if( nums[i] == nums[i+1]) return nums[i];
}
return -1;
}
}
</div>
=======================
- 方法三:(最好)索引下标换位匹配法
因为题目所给:在一个长度为n的数组nums中的所有数字都在0~n-1的范围内,因此数组元素的索引和值是一对多的关系。即可先通过元素对调使元素的值和下标一一对应,一个下标对应两个值则是重复
<div>
class Solution {
public int findRepeatNumber(int[] nums) {
int i= 0, tmp;
while (i<nums.length) {
if(nums[i] == i) {
i++;
continue;
}
if(nums[nums[i]] == nums[i]) return nums[i];
tmp = nums[i];
nums[i] = nums[tmp];
nums[tmp] = tmp;
}
return -1;
}
}
</div>