方法1:通过构建HashMap,记录每个值的重复情况。
复杂度:O(n),O(1)
class Solution {
public int duplicateInArray(int[] nums) {
for(int i = 0;i < nums.length;i++){
if(nums[i]<0||nums[i]>nums.length-1)
return -1;
}
Map<Integer,Integer> map = new HashMap<>();
for(int i = 0;i < nums.length;i++){
if(map.containsKey(nums[i])){
return nums[i];
}else{
map.put(nums[i],1);
}
}
return -1;
}
}
方法2:由于题目特征,构建1-n-1的桶 ,将每个数字放到对应下标的正确位置,
从0开始遍历,不断交换i上的数字和正确位置。如果遇到位置正确的,说明是重复数字;
否则交换二者,将该数字放在正确的位置上;
复杂度:O(n)
class Solution {
public int duplicateInArray(int[] nums) {
int n = nums.length;
for(int i = 0;i < nums.length;i++){
if(nums[i]<0||nums[i]>nums.length-1)
return -1;
}
for(int i = 0; i < n; i++){
while(nums[i]!=i){
if(nums[nums[i]]!= nums[i]){
swap(nums,i,nums[i]);
}else{
return nums[i];
}
}
}
return -1;
}
public void swap(int[] nums,int i,int j){
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}