首先给出例题:
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设nums只有一个重复的整数,找出这个重复的数。
示例 1:
输入:nums = [1,3,4,2,2]
输出: 2
示例 2:
输入: nums = [3,1,3,4,2]
输出: 3
示例 3:
输入: nums = [1,1]
输出: 1
注意点:
1.不更改原数组
2.在数组中只有一个重复的数字,但它可能重复出现很多次
在这里分享的是二分查找法(哈希表法)解题思路
(快慢指针法很妙但还没全搞懂,之后会补上):
首先让中指针指向n/2, 由题意可得,小于n/2的元素只会有(n/2)-1个。
如果超过了(n/2)-1.说明在[1,n/2)区间有重复的数字,此时我们将待查找的数据规模缩小到[1, n/2)。
如果数组没有超过(n/2)-1。说明在[n/2, n]区县有重复的数字,此时我们讲查找的数据规模缩小到[n/2, n].
然后依次类推,直到搜索完成,此时的最小值就是我们要求的重复值。
Python代码解法(参考借鉴别人写的):
class Solution(object):
def findDuplicate(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
start, end = 1, len(nums) - 1
mid = start + (end - start) // 2
while start <= end:
count = 0
for num in nums:
if num < mid:
count += 1
if count >= mid:
end = mid - 1
else:
start = mid + 1
mid = start + (end - start) // 2
return mid
数媒202潘zy