题解 | #数组中重复的数字#
数组中重复的数字
http://www.nowcoder.com/practice/6fe361ede7e54db1b84adc81d09d8524
题目难度:简单
题目考察: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(值域)