标签:数字 速度 code ret length 之间 指针 方法 一个
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 }
标签:数字 速度 code ret length 之间 指针 方法 一个
原文地址:https://www.cnblogs.com/XRH2019/p/11873919.html