题目传送门
方法一:暴力解法(超时)
算法原理
双重循环,每次固定一个数,再遍历别的数。比较这两个数是否相等,
若相等则返回这个数。就是重复数。
复杂度分析
时间复杂度:O(N方)
空间复杂度:O(1)
代码:
class Solution {
public int findDuplicate(int[] nums) {
int n = nums.length;
for(int i = 0; i < n-1; i++){
for(int j = i+1; j < n; j++){
if(nums[i] == nums[j]){
return nums[i];
}
}
}
return -1;
}
}
方法二:哈希表(数组模拟)
算法原理
建立一个大小为n的数组,用来模拟哈希表。
以各个数字作为下标,来统计各个数字出现的次数。
最终遍历这个哈希数组,若有大于1的数,则返回这个下标就是重复出现的数字。
代码:
class Solution {
public int findDuplicate(int[] nums) {
int n = nums.length;
int[] hash = new int[n];
for(int i = 0; i < n; i++){
hash[nums[i]]++;
}
for(int i = 0; i < n; i++){
if(hash[i] > 1){
return i;
}
}
return -1;
}
}
复杂度分析
时间复杂度:O(N) 为这个数组的长度
空间复杂度:O(N)为这个数组的长度
方法三:哈希表(HashSet)
算法原理
创建HashSet这个哈希表。遍历数组,如果这个数字在哈希表中出现了,那么就返回这个数
如果没有出现,那么就将这个数添加到哈希表中。
class Solution {
public int findDuplicate(int[] nums) {
Set<Integer> seen = new HashSet<>();
for(int n : nums){
if(seen.contains(n)){
return n;
}
seen.add(n);
}
return -1;
}
}
复杂度分析
时间复杂度:O(N) 为这个数组的长度,遍历的时候为n次
空间复杂度:O(N)为这个数组的长度