前端算法-寻找重复数

810 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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; 
};