LeetCode 287 – 寻找重复数

题目描述

给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。
假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。
你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。

进阶:
如何证明 nums 中至少存在一个重复的数字?
你可以设计一个线性级时间复杂度 O(n) 的解决方案吗?

示例:
输入:nums = [1,3,4,2,2]
输出:2

题目分析

n + 1 个数字,在 [1, n] 范围内,意味着可以通过 下标 -> 值,构成链表。
链表中至少存在一个环,而重复的数字就是环的入口,问题转换成寻找链表中环的起点。
数字范围是 [1, n],说明 0 一定不在环内,从 0 开始快慢指针即可。

时间复杂度 O(n),空间复杂度 O(1)

Java

public int findDuplicate(int[] nums) {
    int slow = 0, fast = 0;
    do {
        slow = nums[slow];
        fast = nums[nums[fast]];
    } while (slow != fast);

    fast = 0;
    while (slow != fast) {
        slow = nums[slow];
        fast = nums[fast];
    }
    return slow;
}

Kotlin

fun findDuplicate(nums: IntArray): Int {
    var slow = 0
    var fast = 0
    // 快慢指针在环中相交
    do {
        slow = nums[slow]
        fast = nums[nums[fast]]
    } while (slow != fast)

    // 寻找环的起点
    fast = 0
    while (slow != fast) {
        slow = nums[slow]
        fast = nums[fast]
    }
    return slow
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部