给定一个包含n+1
个整数的数组nums
,这些整数都在[1, n]
范围内。假设肯定存在一个重复的整数,求这个整数。
附加要求:
①不能修改数组(假设nums是只读的);
②空间复杂度要求为O(1);
③时间复杂度要求小于O(n2);
④数组中只有一个重复的数字,但是它可以重复多次。
条件①限制不能使用sorted()
对原数组进行排序,条件②限制不能使用dict
进行记录,条件③限制不能使用for循环
嵌套。
二分法:
空间复杂度:O(1);时间复杂度:O(n logn)
数组首尾设置left
和right
,以数组最中间的数字下标(index)
作为基准,称之为mid
。
然后遍历整个数组,若数组中小于mid
的数字的个数小于或等于
它,则多余数字的数值应该大于mid,即left=mid+1
;若数组中小于mid
的数字的个数大于
它,则多余数字的数值应该小于mid,即right=mid-1
。
举例说明:mid=2。正常排序的话,count值应为2,数字为“1”
和“2”
。若count>2,说明数字“1”
和“2”
当中肯定有重复的,即所求的数字应该在前半部分,即right=mid-1
。
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 i in range(len(nums)):
if nums[i] <= mid:
count += 1
if count <= mid:
left = mid+1
else:
right = mid-1
return left