Leetcode offer系刷题 || 查找数组中重复的数字☆
题目:返回数组中任意一个重复数字。2 <= n <= 100000
1.方法一:空间换时间
用另一个数组记录原数组元素出现的次数,将原数组的数据当另一个数组的下标。
class Solution {
public int findRepeatNumber(int[] nums) {
int len=nums.length;
int[] sums=new int[len];
for(int i=0;i<nums.length;i++)
{
System.out.println(sums[i]);
if( sums[nums[i]] !=0 )
{
return nums[i];
}
sums[nums[i]]+=1;
}
return -1;
}
}
2.借助 集合 结构
将一个元素放入集合中,然后判断是否已经在集合中。
耗时耗空间。
Set<Integer> set = new HashSet<Interger>();
//注意这里和开数组的区别,这里后面用的是括号()
set.add(num);//这个函数返回布尔型,true/false
//其他集合和哈希表的用法补充在另外一个基础知识篇中。
3.原地置换!
和第一个想法一样,不过是在原数组地方做置换
将元素为i的元素和下标为i的位置做转换
class Solution {
public int findRepeatNumber(int[] nums) {
int tmp;
for(int i=0;i<nums.length;i++)
{
if(nums[i] == i)
continue;
//注意在这里判断一下,本来在本位置上的跳过
tmp = nums[nums[i]];
if(nums[nums[i]] == nums[i])
{
return nums[i];
}
else
{
nums[nums[i]] = nums[i];
nums[i] = tmp;
}
}
return -1;
}
}
4.哈希表
几个方法中最耗时耗空间的!因为又要查找key,又要存储
class Solution {
public int findRepeatNumber(int[] nums) {
Map<Integer, Integer> hashmap = new HashMap<>();
for(int num : nums){
if(hashmap.containsKey(num)){
return num;
}
hashmap.put(num, 0);
}
return -1;
}
}