【剑指offer】数组中重复的数字
2024-09-07 17:27:05
题目描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。
思路:
这道题是做过的,但是时间久了,忘记了....
自己读题也不仔细,没注意到数字都在0-n-1范围内....
首先,上最好的方法吧。O(N)时间+O(1)空间的
思路是:把数组中的下标和数字对应起来,举例,让numbers[0]中的数字是0,让numbers[1]中的数字是1....
如果说下标已经和数字对应了,又找到了相同的数字就是出现了重复。
由于每个数字只会归位一次,所以是O(N)的算法。
bool duplicate3(int numbers[], int length, int* duplication)
{
if(numbers == NULL) return false;
for(int i = ; i < length; i++)
{
while(numbers[i] != i) //当前位与数字不匹配
{
if(numbers[i] == numbers[numbers[i]])
{
duplication[] = numbers[i];
return true;
}
else //把当前位存储的数字放入正确的位置
{
swap(numbers[i], numbers[numbers[i]]);
}
}
}
return false;
}
用hashtable的方法 时间O(N)空间O(N)
bool duplicate(int numbers[], int length, int* duplication) {
unordered_set<int> us;
for(int i = ; i < length; i++)
{
if(us.find(numbers[i]) == us.end())
{
us.insert(numbers[i]);
}
else
{
duplication[] = numbers[i];
return true;
}
}
return false;
}
排序的方法
static int cmp(const void *a, const void * b)
{
return *(int *)a - *(int *)b;
}
bool duplicate2(int numbers[], int length, int* duplication) {
qsort(numbers, length, sizeof(int), cmp);
for(int i = ; i < length; i++)
{
if(numbers[i] == numbers[i - ])
{
duplication[] = numbers[i];
return true;
}
}
return false;
}
最新文章
- [LeetCode] Decode Ways 解码方法
- Python递归及斐波那契数列
- Bootstrap <;基础二十五>;警告(Alerts)
- Windows下解压版mysql的安装方法
- Python 开发与测试 Webservice(SOAP)
- pandas入门
- Swift-09-可空链式调用(Optional Chaining)
- ThinkPHP中的模型
- 15个带示例的jQuery滚动条插件
- MYSQL死锁
- 想挑战AlphaGO吗?先和PostgreSQL玩一玩?? PostgreSQL与人工智能(AI)
- C++ —— 库函数的 语法解析
- TestNG使用Eclipse建立Test Case - 就是爱Java
- Smarty模版
- js的几种简单排序算法及其效率实测
- ajax如何渲染数据
- word之常用功能
- elasticsearch mysql logstash 同步 简单配置【环境centos7 elasticsearch 6.0 mysql 5.7 logstash 6.0】
- matlab toolboxes 大全
- Jmeter-Maven-Plugin高级应用:Remote Server Configuration