100、技巧-寻找重复的数

思路:

一个非常有效的解法是使用快慢指针法,这个方法灵感来自于寻找链表环的起点的算法。我们可以把数组中的元素看作是链表的指针,例如 nums[0] 指向 nums[nums[0]]。根据题目条件,数组中至少有一个数字重复,这会导致链表出现环。

解法步骤:
  1. 找到环中的任意一个位置

    • 使用快慢指针,快指针每次移动两步,慢指针每次移动一步。由于存在重复元素,这就像在有环的链表中找到相遇点。
  2. 确定环的入口

    • 当快慢指针首次相遇后,将其中一个指针(例如快指针)放回起始位置,然后两个指针都以相同的速度(每次一步)前进。当它们再次相遇时,该位置即为重复数字,也就是环的入口。

 代码如下:

public int findDuplicate(int[] nums) {
    int slow = nums[0];
    int fast = nums[nums[0]];
    
    while (slow != fast) {
        slow = nums[slow];
        fast = nums[nums[fast]];
    }
    
    fast = 0; // 或 slow = 0,然后重新开始
    while (slow != fast) {
        slow = nums[slow];
        fast = nums[fast];
    }
    
    return slow; // 或 fast,此时它们在环的入口处相遇
}

相关推荐

  1. Leetcode 287. 寻找重复

    2024-05-11 11:48:10       45 阅读
  2. leetcode——287 寻找重复

    2024-05-11 11:48:10       46 阅读
  3. leetcode热题HOT 287. 寻找重复

    2024-05-11 11:48:10       164 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-11 11:48:10       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-11 11:48:10       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-11 11:48:10       87 阅读
  4. Python语言-面向对象

    2024-05-11 11:48:10       96 阅读

热门阅读

  1. IT界常说的六大名言

    2024-05-11 11:48:10       29 阅读
  2. SERVER_DOWN 表示该服务器已经宕机或无法访问

    2024-05-11 11:48:10       32 阅读
  3. 代码随想录学习Day 35

    2024-05-11 11:48:10       36 阅读
  4. C语言:初学者和专家的分水岭

    2024-05-11 11:48:10       27 阅读
  5. 设计模式——访问者模式(Visitor)

    2024-05-11 11:48:10       32 阅读
  6. Tensorflow-相关函数

    2024-05-11 11:48:10       29 阅读