287. 寻找重复数-找环-快慢指针

Posted hequnwang10

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了287. 寻找重复数-找环-快慢指针相关的知识,希望对你有一定的参考价值。

一、题目描述

给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。

假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。

你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。

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

二、解题

快慢指针

举个例子 [1,3,4,2,2],index为数组的下标,将下标值对应的数组取出来,作为下一次查找的下标值。由此可以得出一个环。

所以使用快慢指针来找重复的数字,就是找环。环的入口就是我们需要的target。

快指针一次走两步,慢指针一次走一步,

class Solution 
    public int findDuplicate(int[] nums) 
        //快慢指针
        int slow = 0, fast = 0;
        do
            slow = nums[slow];
            fast = nums[nums[fast]];
        while(slow != fast);
        slow = 0;
        //返回环的起始点
        while(slow != fast)
            slow = nums[slow];
            fast = nums[fast];
        
        return slow;
    

二分查找

class Solution 
    public int findDuplicate(int[] nums) 
        //二分查找
        int l = 1, h = nums.length - 1;
        while (l <= h) 
            int mid = l + (h - l) / 2;
            int cnt = 0;
            for (int i = 0; i < nums.length; i++) 
                if (nums[i] <= mid) cnt++;
            
            if (cnt > mid) h = mid - 1;
            else l = mid + 1;
        
        return l;
    

以上是关于287. 寻找重复数-找环-快慢指针的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode287. 寻找重复数(数组模拟链表的快慢指针法)

Leetcode287. Find the Duplicate Number(快慢指针+链表找环的起点)

Leetcode287. Find the Duplicate Number(快慢指针+链表找环的起点)

[编程题] lc [287寻找数组中重复数

快慢指针(寻找在一定范围内包含的成员个数)

287. 寻找重复数