开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第42天,点击查看活动详情
题目
给定一个包含
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;
};