题目难度:简单
题目考察: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(值域)

京公网安备 11010502036488号