力扣练习之寻找重复数

我爱海鲸 2023-10-06 22:41:40 力扣、高级算法

简介高级、力扣

原题出处:https://leetcode.cn/leetbook/read/top-interview-questions-hard/xwz4lj/

解法一(python):

class Solution:
    def findDuplicate(self, nums: List[int]) -> int:
        slow = nums[0]
        fast = nums[0]
        while True:
            slow = nums[slow]
            fast = nums[nums[fast]]
            if slow == fast:
                break
        slow = nums[0]
        while slow != fast:
            slow = nums[slow]
            fast = nums[fast]
        
        return slow

            

思路:快慢指针,第一次遍历,慢指针走一步,快指针走两步,因为存在重复的值,所以总会有相等的时候,相等的时候结束遍历,

然后将慢指针设置为初始值,在和快指针以相同的步数前进,直到他们相等,如果他们相等了,这时返回快慢指针的其中一个就是那个重复的元素。

2023-10-06 start:

class Solution:
    def findDuplicate(self, nums: List[int]) -> int:
        # 初始化二分查找的左右边界
        left, right = 1, len(nums) - 1
        
        while left < right:
            mid = (left + right) // 2  # 计算中间值
            count = 0
            
            # 统计数组中小于等于mid的元素个数
            for num in nums:
                if num <= mid:
                    count += 1
            
            # 根据抽屉原理,如果小于等于mid的元素个数大于mid,说明重复元素在左半部分
            if count > mid:
                right = mid
            else:
                left = mid + 1

        # 最终left和right会相等,它们都指向重复元素
        return left

思路:二分法

end

你好:我的2025