Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate number must exist. Assume that there is only one duplicate number, find the duplicate one.
Note:
- You must not modify the array (assume the array is read only).
- You must use only constant, O(1) extra space.
- Your runtime complexity should be less than
O(n2)
. - There is only one duplicate number in the array, but it could be repeated more than once.
给一个数组,里边有n+1个整数,全部在[1,n]之间,显然肯定有数字出现了不止一次,假设这种数字只有一个,找出来。
注意:1 不能改变数组 2 空间o(1) 3 时间小于N方
不超过n方,那么可以是n或者nlogn。nlogn联想到分治,二分一类的。这个题就是用二分。但是这个数组不一定有序啊?怎么二分呢,所以啊,年轻人思维不要太江化,可以用另一种二分。
举例:
nums=[3,2,1,4,5,5,6]
1 统计1-3之间数字个数 统计4-6之间个数,结果为3,4.显然这个数字在3-6之间
2 ……以此类推吧
class Solution(object):
def findDuplicate(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
min_num,max_num =1,len(nums)-1
while min_num<=max_num:
middle = (min_num+max_num)/2
count1,count2 = 0,0
for i in nums:
if min_num <= i < middle:
count1+=1
elif middle< i <=max_num:
count2+=1
if count1 > (middle - min_num):
max_num = middle - 1
elif count2 >(max_num - middle):
min_num = middle + 1
else:
return middle
return middle