这是崔斯特的第一百零二篇原创文章
题目描述
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。
示例1:
|
|
示例2:
|
|
说明:
|
|
解题思路
二分法
思路是采用了二分法+抽屉原理。首先解释一下为什么用二分法,因为O(n2)时间复杂度不能A,所以往下应该是n*logn,很容易联想到二分法,因为其复杂度为logn。
抽屉原理是说假设你有11个苹果,要放进10个抽屉,那么至少有一个抽屉里是有两个苹果的。
对应到这题,1~n的n+1个数字,有1个数字会至少重复两次。
比如取数组为{1,2,2,3,4,5},一共6个数,范围是1~5,其中位数应该是(5+1)/2 = 3,那么,如果小于等于3的数的个数如果超过了3,那么重复的数字一定出现在[1,3]之间,否则出现在[4,5]之间。以该数组为例,中位数为3,小于等于3的数一共有4个,大于3的数有两个,所以重复的数字在[1,3]之间。
JAVA
|
|
Python
|
|
Go
|
|
快慢指针
数组的索引与存储的数值之间形成了特殊链表。
如果存在重复的数,因为数组大小是 n+1,数字范围是1~n,所以该链表存在环。
环的入口即为结果。
|
|
现在还没看懂这种方法