面试题3:数组中重复的数字
2017-06-01 22:21
232 查看
题目:在一个长度为n的数组里,所有数字都在0 - n-1范围内,数组中的某些数字是重复的,但不知道有几个重复的。请找出其中的任意一个重复数字。
举例:{2,3,1,0,2,5,3对应重复的数字为2或者3。
方法一,哈希表法:
bool duplicate(int numbers[], int length, int* duplication) {//duplicate重复
//与书上的解法不同 空间复杂度O(length) 时间复杂度为O(length)
vector<int > v;
v.resize(length);//确定容器大小
for(int i = 0; i < length; i++)
{
v[numbers[i]]++;
if(v[numbers[i]] >= 2)
{
*duplication = numbers[i];//
return true;
}
}
return false;
}方法二,下标交换:
bool duplicate(int numbers[], int length, int* duplication) {//duplicate重复
//时间复杂度O(n),空间复杂度O(1)
if(length <= 0 || numbers == nullptr)
return false;
for(int i = 0; i < length; ++i)
{
if(numbers[i] >= length || numbers[i] <= 0)
return false;
}
for(int i = 0; i < length; ++i)
{
while(i != numbers[i])
{
if(numbers[i] == numbers[numbers[i]])
{
*duplication = numbers[i];
return true;
}
int tmp = numbers[i];
numbers[i] = numbers[numbers[i]];
numbers[tmp] = tmp;//这里要注意 不是numbers[numbers[i]] 而是numbers[tmp]
}
}
return false;
}
举例:{2,3,1,0,2,5,3对应重复的数字为2或者3。
方法一,哈希表法:
bool duplicate(int numbers[], int length, int* duplication) {//duplicate重复
//与书上的解法不同 空间复杂度O(length) 时间复杂度为O(length)
vector<int > v;
v.resize(length);//确定容器大小
for(int i = 0; i < length; i++)
{
v[numbers[i]]++;
if(v[numbers[i]] >= 2)
{
*duplication = numbers[i];//
return true;
}
}
return false;
}方法二,下标交换:
bool duplicate(int numbers[], int length, int* duplication) {//duplicate重复
//时间复杂度O(n),空间复杂度O(1)
if(length <= 0 || numbers == nullptr)
return false;
for(int i = 0; i < length; ++i)
{
if(numbers[i] >= length || numbers[i] <= 0)
return false;
}
for(int i = 0; i < length; ++i)
{
while(i != numbers[i])
{
if(numbers[i] == numbers[numbers[i]])
{
*duplication = numbers[i];
return true;
}
int tmp = numbers[i];
numbers[i] = numbers[numbers[i]];
numbers[tmp] = tmp;//这里要注意 不是numbers[numbers[i]] 而是numbers[tmp]
}
}
return false;
}
相关文章推荐
- 【我解C语言面试题系列】009 特殊的去除数组中重复数字问题
- [每日练习]Amazon面试题:数组有N-2个数字,数字的范围为1 ... N,没有重复的元素,要求打印缺少的2个数字,不可以用额外的空间
- 剑指Offer面试题51:数组中的重复数字
- 面试题3:数组中重复的数字
- 剑指offer面试题3-数组中重复的数字 java
- 把一个整形数组中重复的数字去掉 - 微软面试题
- 剑指offer-面试题51:数组中重复的数字
- 剑指offer--面试题51: 数组中重复的数字
- 剑指Offer面试题51(Java版):数组中重复的数字
- 剑指offer--面试题3:数组中重复的数字
- 【我解C语言面试题系列】009 特殊的去除数组中重复数字问题
- 面试题55:数组中重复的数字*
- 《剑指Offer》学习笔记--面试题51:数组中重复的数字
- c#面试题 查找整型数组中重复出现次数最多的数字,次数相同数字按从小到大排序
- 把一个整形数组中重复的数字去掉 - 微软面试题
- 【剑指Offer学习】【面试题51:数组中重复的数字】
- 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字
- 【我解C语言面试题系列】008 去除数组中重复数字问题
- 剑指offer 面试题51 数组中重复的数字
- 剑指offer-面试题51-数组中重复的数字