找出1到n中重复的数字

问题描述

在数组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 duplicate(int[] nums){
	if(null == nums || nums.length == 0){
		return Collections.emptyList();
	}

	HashSet set = new HashSet();
	List result = new ArrayList();
	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;
}

 

你可能感兴趣的:(算法题)