面试题3:数组中的重复数字
在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但是不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7,的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。
一、自己的作答情况
是否有思路:有,解法为使用HashMap,时间O(n),空间O(n)。
是否有改进思路:否。
二、官方解答
1. 排序
将数组排好序后,从头到尾扫描,通过比较相邻元素,找到重复数字。
时间O(nlogn),空间O(1)。
2. 哈希表
遍历数组,在哈希表中查询遍历到的数字。如果不存在就加入哈希表;如果存在就找到了重复数字。
时间O(n),空间O(n)。
3. 一个萝卜一个坑
题目关键信息:在一个长度为n的数组里的所有数字都在0~n-1的范围内。
不存在重复的时候是一个萝卜一个坑。当存在重复的时候,萝卜要找到自己的坑。当萝卜找到自己的坑的时候,先看坑里萝卜是不是也属于这个坑。如果坑里的萝卜也属于这个坑,那么就找到了重复的萝卜。如果坑里的萝卜不属于这个坑,就让它腾位置。里层循环的条件是,判断当前的萝卜是不是在自己的坑里。外层是整个数组的遍历。
时间O(n),因为里层循环是O(1)。空间O(1)。
三、扩展题:不修改数组找出重复的数字
在一个长度为n+1的数组中的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的。在不修改输入数组的情况下找出数组中任意一个重复数字。例如输入长度为8的数组{2, 3, 5, 4, 3, 2, 6, 7},则对应输出的是2或者3。
虽然看懂了书中的思路,但是不能深入理解...等想明白再来补充...