开始二刷总结!这是第一题吼吼吼
法一、Set
1.题目分析
本题利用Hashset来加快查找速度。
2.Hashset
HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。底层数据结构是哈希表。
HashSet是基于散列表实现的,元素没有顺序;add、remove、contains方法的时间复杂度为O(1)。(contains为false时,就直接往集合里存)
3.JAVA代码
3.1JAVA代码1(Set)
class Solution {
public int findRepeatNumber(int[] nums) {
Set<Integer> set=new HashSet<Integer>();
int flag=-1;
for(int num:nums){
if(set.contains(num)){
flag=num;
break;
}
else
set.add(num);
}
return flag;
}
}
结果
总结
官方题解是根据 if (!set.add(num)) 往HashSet添加是否成功判断的
我使用了contains判断,需要更多的时间
法二、原地置换
Java代码2(原地置换)
解析
数组中的数字都在0~n-1的范围内,如果数组中没有重复的数字,那么当数组排序后数字i将出现在下标i的位置。
现在让我们重排这个数。从头到尾依次扫描这个数组中的每个数字。当扫描到下标为i的数字时,首先比较这个数字(用m表示)是不是等于i,如果等于就继续扫描下一个数字;如果不是,再拿他跟第m个数字比较,如果他和第m个数字相等,就找到了一个重复的数字(该数字再下标为i和m的位置都出现了);如果他和第m个数字不相等,就把第i个数字和第m个数字交换,把m放到属于他的位置。接下来再重复这个比较,直到我们发现一个重复的数字。
复杂度
时间复杂度O(N) 空间复杂度O(1)
代码
class Solution {
public int findRepeatNumber(int[] nums) {
int temp;
for(int i=0;i<nums.length;i++){
while(nums[i]!=i){
if(nums[i]==nums[nums[i]])
return nums[i];
//交换nums[i]和nums[nums[i]]
temp=nums[i];
nums[i]=nums[temp];//nums[temp]即nums[nums[i]]
nums[temp]=temp;//temp即nums[i]
}
}
return -1;
}
}