【剑指offer】52. 数组中重复的数字
总目录:
1.问题描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。
也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1
数据范围:0≤n≤10000
进阶:时间复杂度O(n),空间复杂度O(n)
2.问题分析
1哈希表
借助哈希表检索时间复杂度为O(1)的特性
2重排
如果仅仅是排序之后两两比较,并没有充分利用已知条件。
利用题中n个数,范围都在0~n-1之间的特性,这才充分利用了本题条件。
将数值n存放回array[n],如果array[n]处已经有数值n,则n为重复数值,返回即可
3.代码实例
哈希法
1 class Solution { 2 public: 3 /** 4 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 5 * 6 * 7 * @param numbers int整型vector 8 * @return int整型 9 */ 10 int duplicate(vector<int>& numbers) { 11 int dataLen = numbers.size(); 12 if (dataLen <= 0) { 13 return -1; 14 } 15 16 unordered_set<int> map; 17 for(int i=0;i<dataLen;i++){ 18 if(map.find(numbers[i])!=map.end()){ 19 return numbers[i]; 20 } 21 22 map.insert(numbers[i]); 23 } 24 25 return -1; 26 } 27 };
重排
class Solution { public: int duplicate(vector<int>& numbers) { int dataLen = numbers.size(); if (dataLen <= 0) { return -1; } for (int i = 0; i < dataLen; i++) { //值已归位 if (numbers[i] == i) { continue; } //想要将值归位,却发现目的地已经有归位的值 if (numbers[numbers[i]] == numbers[i]) { return numbers[i]; } //未冲突的情况下,交换两个值 swap(numbers[i], numbers[numbers[i]]); } return -1; } };