算法1
将当前位置的数值放到他的位置上去,比如{2,2,3,3,4},将nums[0]的数应该放到nums[2]上,即将该数组放到他在数组中和他角标相等的位置,每次都检查要交换的位置上的数值是否一样,如果一样,则重复,如果不一样,则交换。
时间复杂度分析:$o(n)$
JAVA 代码
public int duplicateInArray(int[] nums) {
int len = nums.length;
if(nums==null||len==0)
return -1;
Set<Integer> set = new HashSet<>();
for(int i =0;i<len;i++){
if(nums[i]<0||nums[i]>len-1)
return -1;
}
// Arrays.sort(nums);
for(int i = 0;i<len;i++){
while(nums[i]!=i){
if(nums[i]==nums[nums[i]])
return nums[i];
int temp = nums[i];
nums[i] = nums[temp];
nums[temp] = temp;
}
}
return -1;
}
算法2
将数组进行排序,将当前位置和下一位置的数字进行对比,如果一样,则方法结束并返回
JAVA 代码
public int duplicateInArray(int[] nums) {
int len = nums.length;
if(nums==null||len==0)
return -1;
Set<Integer> set = new HashSet<>();
for(int i =0;i<len;i++){
if(nums[i]<0||nums[i]>len-1)
return -1;
}
Arrays.sort(nums);
for(int i = 0;i<len-1;i++){
if(nums[i]==nums[i+1])
return nums[i];
}
return -1;
}
算法3
用hashset的add方法,如果哈希表中没有这个数据,则返回true并加入,如果有,则返回false
JAVA 代码
public int duplicateInArray(int[] nums) {
int len = nums.length;
if(nums==null||len==0)
return -1;
Set<Integer> set = new HashSet<>();
for(int i =0;i<len;i++){
if(nums[i]<0||nums[i]>len-1)
return -1;
}
Arrays.sort(nums);
for(int i = 0;i<len;i++){
if(!set.add(nums[i]))
return nums[i];
}
return -1;
}
刚学java
我直接复制这个代码,提交为什么会报错啊?
为什么是和下一位的数字进行比较呢?
感谢‘’‘’