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(快慢指针+链表找环的起点)