在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1
数据范围:
进阶:时间复杂度
,空间复杂度%5C)
[2,3,1,0,2,5,3]
2
2或3都是对的
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型一维数组
* @return int整型
*/
public int duplicate (int[] numbers) {
HashSet<Integer> set = new HashSet<>();
for (int i = 0; i < numbers.length; i++) {
if (set.contains(numbers[i])) {
return numbers[i];
}
set.add(numbers[i]);
}
return -1;
}
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型一维数组
* @return int整型
*/
public int duplicate (int[] numbers) {
// write code here
Map<Integer,Integer> map = new HashMap();
for(int num : numbers){
if(map.containsKey(num)){
return num;
}else{
map.put(num,num);
}
}
return -1;
}
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型一维数组
* @return int整型
*/
public int duplicate (int[] numbers) {
// write code here
int length = numbers.length;
/* if (length <= 0) {
return -1;
} */
List<Integer> list = new ArrayList<>();
for (int i = 0; i < length; i++) {
if (list.contains(numbers[i])) {
return numbers[i];
}
list.add(numbers[i]);
}
return -1;
}
} public class Solution {
public int duplicate (int[] numbers) {
HashSet<Integer> set = new HashSet<>();
for (int i = 0; i < numbers.length; i++) {
if (set.contains(numbers[i])) {
return numbers[i];
}else {
set.add(numbers[i]);
}
}
return -1;
}
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 采用散列的方式,散列槽足够大,冲突的就是重复的。(布隆过滤器)
*
* @param numbers int整型一维数组
* @return int整型
*/
public int duplicate (int[] numbers) {
// 通过一个散列函数,映射对应的空间
int size = numbers.length;
int[] numbersCopy = new int[size];
for(int i = 0; i<size;i++){
int num = numbers[i];
if(num > 10000){
return -1;
}
int index = num%10000;
System.out.println("实际值:"+index+numbersCopy[index]);
if(numbersCopy[index] == 100001){
return num;
}else{
numbersCopy[index] = 100001;
}
}
return -1;
}
} public int duplicate (int[] numbers) {
//这种思路下,无需对数组排序,性能差不多
int n = 0;
if(numbers.length < 1) {
return -1;
}
//直接拿第一个依次往后循环比较,不符合就换下一个
while (true) {
for (int i = n + 1; i < numbers.length; i++ ) {
if (numbers[i] == numbers[n]) {
return numbers[n];
}
//但比较到最后一个元素,说明没有重复元素
if (n == numbers.length-1) {
return -1;
}
}
n++;
}
}
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型一维数组
* @return int整型
*/
public int duplicate (int[] numbers) {
// write code here
//Set数组
Set<Integer> set = new HashSet<>();
for(int i = 0;i < numbers.length;i++){
if(!set.add(numbers[i])){
return numbers[i];
}
}
return - 1;
}
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型一维数组
* @return int整型
*/
public int duplicate (int[] numbers) {
// write code here
int length = numbers.length;
int[] temp = new int[length];
for(int i=0;i<length;i++){
temp[numbers[i]]++;
}
for(int i=0;i<length;i++){
if(temp[i]>1) return i;
}
return -1;
}
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型一维数组
* @return int整型
*/
public int duplicate (int[] numbers) {
// write code here
for(int i = 0;i<numbers.length;i++){
//如果元素与下标相同则跳过该次循环
if(numbers[i] == i){
continue;
} else{
//判断是否出现重复的元素.如果为true,则返回该元素
if(numbers[i] == numbers[numbers[i]]){
return numbers[numbers[i]];
}
}
//进行元素交换
int temp = numbers[i];
numbers[i] = numbers[temp];
numbers[temp] = temp;
}
//数组有错误或者该数组为有序数组(无重复)
return -1;
}
} public int duplicate (int[] numbers) {
int n=numbers.length;
//dp[number[i]] 记录第 number[i]是否已存在 0/1
int[] dp=new int[n];
for(int i=0;i<n;i++){
//题目意思要我们自测numbers数组是否合法[0,n-1]
if(numbers[i]>n-1||numbers[i]<0){
return -1;
}
dp[i]=0;
}
for(int i=0;i<n;i++){
if(dp[numbers[i]]==0){
dp[numbers[i]]=1;
}else{
return numbers[i];
}
}
return -1;
}