第一种方法:遍历一遍数组,依次放入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;
}
};
本文介绍了两种查找数组中重复数字的算法。第一种利用哈希表存储元素,快速定位重复项;第二种采用原地置换策略,通过元素与索引的关系判断重复。适合对算法效率有高要求的开发者。
4863

被折叠的 条评论
为什么被折叠?



