38/100. Find the Duplicate Number

在这里插入图片描述
给定一个包含n+1个整数的数组nums,这些整数都在[1, n]范围内。假设肯定存在一个重复的整数,求这个整数。
附加要求:
①不能修改数组(假设nums是只读的);
②空间复杂度要求为O(1);
③时间复杂度要求小于O(n2);
④数组中只有一个重复的数字,但是它可以重复多次。

条件①限制不能使用sorted()对原数组进行排序,条件②限制不能使用dict进行记录,条件③限制不能使用for循环嵌套。

二分法:
空间复杂度:O(1);时间复杂度:O(n logn)

数组首尾设置leftright,以数组最中间的数字下标(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

猜你喜欢

转载自blog.csdn.net/weixin_39010770/article/details/86182929