题目:
在一个长度为n+1的数组里的所有数字都在1~n的范围内,找出数组中的任意一个重复数字,但不能修改原数组。
思路:
由于题目要求不可以修改原数组,故不可用先排序再找重复数字的思路,也不可用Offer03-1中的思路。因此可以考虑使用特殊的哈希表,
即同样大小的数组,将原数组的数字放在对应的索引处,但需要O(n)的空间。利用此题的特殊条件:所有数字都在1n的范围内,可以想到利用二分法n的范围内,所有1
寻找。n+1个数字在1n中必定有重复数字,取1n的中间值mid,若1mid的数量大于mid,则重复数字必定在1mid中,这便是二分法
的典型思路。
代码:
二分法:
1 | public int getDuplication(int[] nums,int length) { |
复杂度分析及总结:
循环:
时间复杂度:
O(nlogn)。
空间复杂度:
O(1)。
与利用哈希表相比,此方法用时间换取了空间。