《剑指offer》之数组中重复的数字

23 阅读1分钟

题目链接:数组中重复的数字

题目描述

在一个长度为n的数组里的所有数字都在0n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组 [2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出 -1

数据范围:0≤n≤10000 0≤n≤10000 

进阶:时间复杂度O(n) ,空间复杂度 O(n)

示例1

输入:

[2,3,1,0,2,5,3]

返回值:

2

说明:

2或3都是对的 

代码实现&思路

初始化一个标记数组,然后遍历原始数组,用原始数组的值作为标记数组的下标,因为数据在0~n-1之间,所以不会越界。如果已经被标记过,那么说明存在重复数据,循环结束代表没有重复数据返回-1即可。 实现如下:

public int duplicate (int[] numbers) {
    // 数组长度为1直接跳出
    if(numbers.length==1){
        return -1;
    }
    //初始化一个标记数组boolean类型,默认为false
    //题目中给出数组中的元素是0~n-1,所以算法就是遍历数组,然后用元素值作为标记数组index
    boolean[] visited = new boolean[numbers.length];
    //一次循环,如果该元素已经被访问过,则返回该元素,否则将该元素标记为true
    for(int i=0;i<numbers.length;i++){
        if(visited[numbers[i]]){
            return numbers[i];
        }else{
            visited[numbers[i]]=true;
        }
    }
    //循环跳出之后说明没有重复元素,返回-1
    return -1;
}