leetcode.数组.287寻找重复数-Java

1. 具体题目

给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。

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

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

说明:

不能更改原数组(假设数组是只读的)。
只能使用额外的 O(1) 的空间。
时间复杂度小于 O(n2) 。
数组中只有一个重复的数字,但它可能不止重复出现一次。

2. 思路分析

由于题目要求不能更改原数组且只能用额外 O(1)的空间,所以 “将数组排列” 或者 “利用HashSet存储数组元素” 都不可用。

题解中利用了快慢指针方法:指针的移动方法为 nextIndex = currValue,令快指针每次移动两个单位,慢指针移动一个单位。由于数组中存在重复元素,所以会构成一个环,所以快指针总会追上慢指针。追上之后,需要找到环的入口。假设数组重复元素为 i,那么环的入口就是index = i 的位置,找到环的入口就得到结果值。

3. 代码

 1  public int findDuplicate(int[] nums) {
 2         if(nums.length == 1) return nums[0];
 3         //设置快慢指针,快指针移动速度为慢指针的2倍,由于存在环,快指针会在环中追到慢指针
 4         int slow = nums[0], fast = nums[0];
 5         do{
 6             slow = nums[slow];
 7             fast = nums[nums[fast]];
 8         }while(slow != fast);
 9             
10         //找到环的入口
11         slow = nums[0];
12         while(slow != fast){
13             slow = nums[slow];
14             fast = nums[fast];
15         }
16         return fast;
17     }

猜你喜欢

转载自www.cnblogs.com/XRH2019/p/11873919.html