问题描述
在数组nums[n + 1]中,数字都是1到n范围内的,那么至少有一个重复数字,找到它。
解法1 排序法 时间O(nlgn) 空间O(n)
public static int duplicate(int[] nums){
if(null == nums || nums.length == 0){
return Collections.emptyList();
}
Arrays.sort(nums);
for(int i = 1; i < nums.length; i++){
if(nums[i - 1] == nums[i]){
return nums[i];
}
}
return -1;
}
解法2 Hash法 时间O(n) 空间O(n)
public static List<Integer> duplicate(int[] nums){
if(null == nums || nums.length == 0){
return Collections.emptyList();
}
HashSet<Integer> set = new HashSet<Integer>();
List<Integer> result = new ArrayList<Integer>();
for(int i = 0; i < nums.length; i++){
if(set.contains(nums[i])){
return nums[i];
}else{
set.add(nums[i]);
}
}
return -1;
}
解法3 标记法 时间O(n) 空间O(1)
public static int duplicate(int[] nums){
if(null == nums || nums.length == 0){
return -1;
}
for(int i = 0; i < nums.length; i++){
int next = nums[i] - 1;
//遍历过程中,已经指过,也就是已经遍历过等于 i+1 的数
if(nums[i] > nums.length){
next -= nums.length;
}
if(nums[next] > nums.length){
return next + 1;
}else{
//加 n(数组长度) 作为标记
nums[next] += nums.length;
}
}
return -1;
}