287. 寻找重复数 二分方法

给定一个 n + 1 个整数组成的数组 nums,其数字都在 1 到 n 之间(包括 1,n),可知至少存在一个重复的整数。
题意:1~n个数本来该是n个数,组成n+1个数,则必然有重复数,找出重复数,而且题目假设只有一个重复数,所以剩下的数要填满1-n的数

使用二分方法,统计<=mid的个数,如果左边不重复,则<=mid的数,应该为mid的值,如果大于mid的值,说明有左边有重复的数,反之右边有重复的数;抽屉原理
不改变原数组的排序,空间复杂度为O(1)

本题说的nums的范围是[1,n],所以去找中位数mid,然后nums和中位数去比较,虽然nums没有排序,但是整个nums中小于等于mid的个数,要是比mid大,说明统计的时候左边多统计了有重复数

class Solution:
    def findDuplicate(self, nums: List[int]) -> int:
        left,right=0,len(nums)-1
        while left<right: #<还是<=可以后期推一遍,看<=能不能运行,=的时候,left list out of index
            mid=left+(right-left)//2
            count=0
            for num in nums:
                if num<=mid: #统计<=mid的个数 即左边的个数不是完全处于中位数分布的左边,是有重复数的
                    count+=1
            if count>mid: #如果个数>mid,说明重复元素在左边
                right=mid
            else:
                left=mid+1
        return left

参考链接
时间复杂度O(nlongn)for循环n,二分法logn

你可能感兴趣的:(再看几遍)