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

解法一:弗洛伊德的龟和兔子(C++)

寻找重复数

这题主要找的是循环入口!!!这就要想起了如何求链表的循环入口了

一个链表中包含环,请找出该链表的环的入口结点

class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        int tortoise = nums[0];
        int hare = nums[0];
        while(1)
        {
            tortoise = nums[tortoise];
            hare = nums[nums[hare]];
            if(tortoise==hare) break;
        }
        int ptr1 = nums[0];
        int ptr2 = tortoise;
        while(ptr1 != ptr2)
        {
            ptr1 = nums[ptr1];
            ptr2 = nums[ptr2];
        }
        return ptr1;
    }
};

弗洛伊德的龟和兔子的类似题:

解法二:二分法(Python)

二分法+快慢指针 逐行解释 python3

class Solution:
    def findDuplicate(self, nums: List[int]) -> int:
        left = 1
        right = len(nums) - 1
        while left < right:
            mid = (left + right) // 2
            cnt = 0
            for num in nums:
                if num <= mid:
                    cnt += 1
            if cnt <= mid:
                left = mid + 1
            else:
                right = mid 
        return left

发布了152 篇原创文章 · 获赞 22 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_38204302/article/details/105053496