第一种方法:遍历一遍数组,依次放入hash表。一旦遇到一个元素哈希表中已经有了,就是第一个重复的数字。
class Solution {
public:
bool duplicate(int numbers[], int length, int* duplication) {
if(numbers == nullptr || length<=0 || duplication == nullptr)
return false;
unordered_map<int, int> map;
for(int i=0; i<length; i++){
if(map.count(numbers[i]) == 0){
map.insert(make_pair(numbers[i], 1));
}
else{
*duplication = numbers[i];
return true;
}
}
return false;
}
};
同样使用哈希表,另一种写法可扩展性更强,稍加修改就可以返回所有的/任意位置的重复数字。
class Solution {
public:
bool duplicate(int numbers[], int length, int* duplication) {
if(numbers == nullptr || length<=0 || duplication == nullptr)
return false;
unordered_map<int, int> map;
for(int i=0; i<length; i++) {
map[numbers[i]]++;
}
int count = 0;
for(int i=0; i<length; i++) {
if(map[numbers[i]] > 1) {
duplication[count++] = numbers[i];
return true;
}
}
return false;
}
};
第二种方法:剑指Offer书上的解法,每个数字最多交换两次就能够找到属于自己的位置
class Solution {
public:
bool duplicate(int numbers[], int length, int* duplication) {
if(numbers == nullptr || length<=0 || duplication == nullptr)
return false;
for(int i=0; i<length; i++) {
if(numbers[i] != i) {
if( numbers[i] == numbers[numbers[i]] ) {
*duplication = numbers[i];
return true;
}
else{
int tmp = numbers[i];
numbers[i] = numbers[tmp];
numbers[tmp] = tmp;
}
}
}
return false;
}
};