题目描述
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。
示例 1:
输入: [1,3,4,2,2]
输出: 2
示例 2:
输入: [3,1,3,4,2]
输出: 3
说明:
不能更改原数组(假设数组是只读的)。
只能使用额外的 O(1) 的空间。
时间复杂度小于 O(n2) 。
数组中只有一个重复的数字,但它可能不止重复出现一次。
思路分析
- 当考虑mid的时候,可以确定,整个nums中小于等于mid的数的个数肯定要小于等于mid,比如3这个数,在1—100这个数组中,小于等于3的数的个数肯定就只有三个,如果出现了四个,那就说明肯定有重复数字,那么需要找的数肯定在mid的左侧区间内;如果出现了三个或者三个以下,那么需要找的数肯定在mid的右侧。
代码示例
class Solution(object):
def findDuplicate(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
left = 0
right = len(nums) - 1
while left <= right:
mid = (left + right) // 2
count = 0
for num in nums: # 遍历了全部的nums
if num <= mid:
count += 1
if count <= mid:
left = mid + 1
else:
right = mid-1
return left
- 2019年5月16日