赞
踩
开始二刷总结!这是第一题吼吼吼
本题利用Hashset来加快查找速度。
HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。底层数据结构是哈希表。
HashSet是基于散列表实现的,元素没有顺序;add、remove、contains方法的时间复杂度为O(1)。(contains为false时,就直接往集合里存)
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判断,需要更多的时间
数组中的数字都在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; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。