题解 | #数组中重复的数字#

数组中重复的数字

http://www.nowcoder.com/practice/6fe361ede7e54db1b84adc81d09d8524

题目:
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任一一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1。

1.排序法 (允许改变数组)
先进行排序,再相邻元素进行等值判断。
时间复杂度:O(nlogn)
空间复杂度:O(1)

2.hash方法(没有改变数组)
解题思路:
(1) 声明hash表
(2) 使用数组构造哈希表
(3)对哈希表的value进行判断,若大于1,即表明数字重复出现
int duplicate(vector<int>& numbers)
{
if(numbers.size() == 0) return -1;
unordered_map<int, int> map;
for(int i =0; i < numbers.size(); i++)
{
map[numbers[i]]++;
if(map[numbers[i]]> 1) return numbers[i];
}
return -1;
}
时间复杂度:O(n),一层循环
空间复杂度:O(n),最坏情况,没有元素重复,hash表需要存所有的值,即需要O(n)空间存储所有元素</int>

3.替换法
关键是:数组长度为n,且所有数字范围在0~n-1之间。因此如果数字没有重复,那numbers[i] = i;
思路是:如果进行了正常的排序,那么i与对应的数字是相同的,本题的巧妙在于swap(numbers[i], numbers[numbers[i]])实现了前面所说的对应关系。
int duplicate(vector<int>& numbers)
{
if(numbers.empty()) return -1;
for(int i = 0; i < numbers.size(); i++)
{
while(numbers[i] != i)
{
if(numbers[i] == numbers[numbers[i]])
{
return numbers[i];
}
else{
swap(numbers[i], numbers[numbers[i]]);
}
}
}
return -1;
}
时间复杂度:O(n)
空间复杂度:O(1)</int>

全部评论

相关推荐

Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-11 11:21
被夸真的超级开心,好可爱的姐姐
码农索隆:老色批们不用脑补了,我把金智妮的图找来了查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务