LeetCode Hot-287寻找重复数

给定一个包含 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) 。
数组中只有一个重复的数字,但它可能不止重复出现一次。

LeetCode Hot-287寻找重复数_第1张图片
首先是暴力法,判断任意两个数是否相同,结果也很真实,c的过了,python的没过,应该不用解释,看代码就懂,贴上代码

int findDuplicate(int* nums, int numsSize){
    for(int i = 0; i<numsSize; i++){
        for(int j = i+1; j<numsSize; j++){
            if(nums[i] == nums[j]){
                return nums[i];
            }
        }
    }
    return 0;
}

二分法:
什么意思呢,也就是n+1个个整数的数组 nums,其数字都在 1 到 n 之间,必然有一个数是重复的,比如 [1,2,3,4,4]

左区间x, 右区间y
每次取一半按照上面的例子mid = (x + y) / 2
小于等于mid的个数是 count
如果 count > mid 区间缩小为[x, mid]
否则是 [mid+1, y]
知道x>=y结束

代码

class Solution:
    def findDuplicate(self, nums: List[int]) -> int:
        x = 1
        y = len(nums) - 1
        while x < y:
            count = 0
            mid = int((x + y) / 2)
            for i in range(len(nums)):
                if nums[i] <= mid:
                    count += 1
            if count > mid:
                y = mid
            else:
                x = mid + 1
        return x

快慢指针
等我考完四六级在补上

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-the-duplicate-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

你可能感兴趣的:(LeetCode,LeetCode,Hot)