import java.util.*;
public class Solution {
// Parameters:
// numbers: an array of integers
// length: the length of array numbers
// duplication: (Output) the duplicated number in the array number,length of duplication array is 1,so using duplication[0] = ? in implementation;
// Here duplication like pointor in C/C++, duplication[0] equal *duplication in C/C++
// 这里要特别注意~返回任意重复的一个,赋值duplication[0]
// Return value: true if the input is valid, and there are some duplications in the array number
// otherwise false
//方法一(时间复杂度为O(n),空间复杂度为O(n))
public boolean duplicate(int numbers[],int length,int [] duplication) {
if(numbers==null||length==0)
{
return false;
}
boolean tag=false;
LinkedHashMap<Integer,Integer>link=new LinkedHashMap<>();
for(int i=0;i!=length;i++)
{
if(!link.containsKey(numbers[i]))
{
link.put(numbers[i],1);
}else{
int temp=link.get(numbers[i]);
link.put(numbers[i],++temp);
}
}
for(int i:link.keySet())
{
if(link.get(i)>1)
{
duplication[0]=i;
tag=true;
break;
}
}
//System.out.println(duplication[0]);
return tag;
}
//第二种解法(时间复杂度为O(n),额外空间复杂度为O(n))
public boolean duplicate2(int numbers[],int length,int [] duplication) {
if(numbers==null||length==0)
{
return false;
}
boolean[]boolean2=new boolean[length];
for(int i=0;i!=length;i++)
{
if(boolean2[numbers[i]]==true)
{
duplication[0]=numbers[i];
//System.out.println(duplication[0]);
return true;
}
boolean2[numbers[i]]=true;
}
return false;
}
//第三种解法(不需要额外的空间,时间复杂度为O(n))
public boolean duplicate3(int numbers[],int length,int [] duplication) {
if(numbers==null||length==0)
{
return false;
}
for(int i=0;i!=length;i++){
int index=numbers[i];
if(index>=length){
index-=length;
}
if(numbers[index]>=length){
duplication[0]=index;
//System.out.println(duplication[0]);
return true;
}
numbers[index]+=length;
}
return false;
}
public static void main(String[]args){
int[]arr={2,3,1,0,2,5,3};
int[]dup=new int[1];
Solution s=new Solution();
System.out.println(s.duplicate3(arr,7,dup));
}
}
数组中重复的数字
最新推荐文章于 2020-06-03 11:07:20 发布