
双重循环,每次固定一个数,再遍历别的数。比较这两个数是否相等, 若相等则返回这个数。就是重复数。
时间复杂度: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这个哈希表。遍历数组,如果这个数字在哈希表中出现了,那么就返回这个数 如果没有出现,那么就将这个数添加到哈希表中。
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)为这个数组的长度