题目
给定一个包含
n + 1
个整数的数组nums
,其数字都在[1, n]
范围内(包括1
和n
),可知至少存在一个重复的整数。
输入: nums = [3,1,3,4,2] 输出: 3
思路一
我们这里可以使用Set数据结构结合循环进行实现,我们先声明一个set变量,它的值是Set数据结构的实例,然后在声明一个i变量,默认值为0,然后进行循环,循环条件为i变量小于形参nums数组长度,在循环中我们使用Set数据结构的has方法进行判断当前形参nums每一项是否存在与set数据结构中,如果存在则直接将形参nums数组的存在项返回出去,如果不存在则使用Set数据结构的add方法将当前形参nums数组的循环值添加到set变量中,然后让i变量自增1,如果循环结束还没有返回值则直接返回-1
var findDuplicate = function(nums) { let set = new Set() let i = 0 while (i < nums.length) { if (set.has(nums[i])){ return nums[i] } set.add(nums[i]) i++ } return -1 };
思路二
我们这里可以使用双循环进行实现,我们先声明两个变量,分别是slow和fast变量,默认值都为0,slow变量为慢指针,fast变量为快指针,然后进行第一次循环,循环条件为当slow变量和fast变量不相等时进行循环,慢指针slow变量每次走一步,快指针fast变量每次走两步,当slow变量和fast变量的值相等时,将slow变量的值重置为0,然后进行第二次循环,第二次的循环条件为slow变量和fast变量的值不相等时进行循环,这里慢指针slow变量和快指针fast变量每次都只走一步,最后将慢指针slow变量返回出去即可
var findDuplicate = function(nums) { let slow = 0; let 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; };