面试题3:数组中重复数字
题目一
- 长度为n的数组
- 所有数字都在0~n-1
- 找出数组中任意一个重复的数字
- 长度为7的数组{2,3,1,0,2,5,3}
- 数字2或3
- 还可用哈希表来解决这个问题。
- 时间复杂度O(n),
- 提高时间效率是以一个大小为On)哈希表为代价
- 有没有空间复杂度是O(1)
- 数组中的数字都在0~n-1。
- 如果这个数组中没有重复的数字,那么当数组排序之后数字i将出现在下标为i的位置。
- 数组中有重复的数字,有些位置可能存在多个数字,同时有些位置可能没有数字
- 重排这个数组。
- 从头到尾扫描这个数组中每个数
- 扫到下标为i的数时,
- 先比较这个数(用m表示)是不是等于i
- 如果是,则接着扫描
- 如果不是,则再拿它和第m个数比较
- 如果它和第m个数相等,就找到一重复
- 如果它和第m个数不等,就把第i个数和第m个交换
- 把m放到属于它的位置
- 接下来再重复这个比较、交换的过程,直到我们发现一个重复的数字
- {2,3,1,0,2,5,3}。
- 第0个数是2,与它的下标不等,交换
- {1,3,2,0,2,5,3}
- 第0个数字是1,仍然与下标不等,交换
- {3,1,2,0,2,5,3}
- 继续交,
- {0,1,2,3,2,5,3}。
- 第0个数字的数值为0,接着扫描下一数。
- 下标为1、2、3的3个数字分別为1、2、3,
- 不执行任何
- 接下来扫描到下标为4的数字2。
- 由于它的数值与它的下标不相等,再比较它和下标为2的数字。
- 此时数组中下标为2的数字也是2,
- 也就是数字2在下标为2和下标为4的两个位置都出现了,
- 找到一个重复
题目二:不修改数组找出重复的数字
- 长度n+1的数组
- 所有数字都在1~n
- 数组中至少有一个数字重复
- 找出数组中任意一个重复数字
- 不能修改输入的数组。
- 长度为8的数组 2 3 5 4 3 2 6 7
在1-7之间
- 对应的输出是重复的数字2或3
- 为什么数组中会有重复数?
- 假如没有重复数字,从1~n的范围里只有n个数。
- 数组里含超过n个数
- 一定包含重复数字
- 在某范围里数字的个数对解决这个问题很重要
- 从1~n的数字从中间的数字m分为两部分
- 1~m
- m+1~n
- 如果1~m的数字数目超过m,那这一半的区间里一定包含重复的数字
- 否则,另一半m+1~n的区间里一定包含重复的数字。
指的是1~m这些数在整个数组中出现的次数哦!!
- 我们可以继续把包含重复数字的区间一分为二,直到找到一个重复的
数字。 - 和二分查找算法很类似,只是多了一步统计区间里数字的数目
- 长度为8数组{2,3,5,4,3,2,6,7
- 中间的数字4把1~7的范围分为两段,
- 14,另一段是57。
- 统计1-4这4个数字在数组中出现的次数,它们一共出现了5次,因此这4个数字中一定有重复数
- 把1~4的范围一分为二,
- 1、2两个,
- 3、4两个数。
- 数字1或者2在数组中一共出现了两次。
- 再统计数字3或者4在数组中出现的次数,共出现三次。
- 3、4两个数中一定有一个重复。
- 再分别统计这两个数字在数组中出现的次数。
- 发现3出现了两次
- 每次统计都要扫描一次数组
- 但好在只需要统计 次