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

题目分析:
这题有很多种做法,排序,map,bool数组,等等,下面给出这四种做法,实际上思路都很简单
算法1:排序
先对数组排序,遍历过程判断有无相同值即可
代码如下

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param numbers int整型vector 
     * @return int整型
     */
    int duplicate(vector<int>& numbers) {
        // write code here
        if(!numbers.size())return -1;
        sort(numbers.begin(),numbers.end());
        for(int i=0;i<numbers.size()-1;i++)
        {
            if(numbers[i]==numbers[i+1])return numbers[i];
        }
        return -1;
    }
};

复杂度分析
对数组排序,时间复杂度O(nlogn)
没有使用额外空间,空间复杂度O(1)
时间复杂度较高
算法2:map
在遍历的过程中使用map记录当前数,遍历前这个数存在说明重复
代码如下

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param numbers int整型vector 
     * @return int整型
     */
    int duplicate(vector<int>& numbers) {
        // write code here
        unordered_map<int,int>h;
        for(int i=0;i<numbers.size();i++)
        {
            if(h.count(numbers[i]))return numbers[i];
            h[numbers[i]]=1;
        }
        return -1;
    }
};

复杂度分析
遍历数组,时间复杂度O(n)(unordered_map期望复杂度是O(1)),使用map则是O(nlogn)
使用额外空间,空间复杂度O(n)
算法3:st数组
在遍历的过程中使用st数组记录当前数,遍历前这个数存在说明重复
代码如下

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param numbers int整型vector 
     * @return int整型
     */
    int duplicate(vector<int>& numbers) {
        // write code here
        bool st[10010]={0};
        for(int i=0;i<numbers.size();i++)
        {
            if(st[numbers[i]])return numbers[i];
            st[numbers[i]]=1;
        }
        return -1;
    }
};

复杂度分析
遍历数组,时间复杂度O(n)、
使用额外空间,空间复杂度O(值域)