算法题解-重复数寻找

124 阅读3分钟

题目

给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。

输入: nums = [1,3,4,2,2]
输出: 2

题解

第一种

我们在函数中使用了sort方法将数组元素按照升序进行排序,排序后的数组被重新赋值给nums变量,然后我们在声明了一个常量len,表示数组的长度,然后我们使用一个循环来遍历数组中的每个元素,循环的索引变量i从0开始,逐渐增加,直到达到数组的长度,在循环中,我们声明了两个变量low和high,分别表示当前元素的下一个位置和数组的最后一个位置,然后我们使用一个循环来在low和high之间进行二分查找,循环的条件为low小于等于high,在循环中我们计算中间位置的索引middle,然后我们通过比较当前元素nums[i]和中间位置的元素nums[middle]是否相等,如果相等则说明找到了重复的元素,然后将其返回出去即可,如果当前元素大于中间位置的元素则说明重复的元素在当前元素的右侧,我们将low更新为middle + 1,继续在右侧进行查找,如果当前元素小于中间位置的元素则说明重复的元素在当前元素的左侧,我们将high更新为middle - 1,继续在左侧进行查找,如果while循环结束后仍然没有找到重复的元素,我们将执行下一次for循环,继续查找下一个元素,当整个循环结束后我们如果仍然没有找到重复的元素则返回-1即可

var findDuplicate = function(nums) {
    nums = nums.sort((a, b) => a - b)
    const len = nums.length
    for (let i = 0; i < len; i++) {
       let low = i + 1
       let high = len - 1
       while (low <= high) {
           let middle = (low + high) >> 1
           if (nums[i] === nums[middle]) {
               return nums[middle]
           } else if (nums[i] > nums[middle]) {
               low = middle + 1
           } else {
               high = middle - 1
           }
       }
    }
    return -1
};

第二种

我们声明了两个变量start和end并将它们的初始值都设置为数组nums的第一个元素nums[0],然后我们使用循环,在循环中start的值被更新为nums[start],end的值被更新为nums[nums[end]],这个循环会一直执行,直到start和end的值相等为止,然后我们声明了两个临时变量temp和end,它们的初始值为数组nums的第一个元素nums[0]和nums[nums[end]]的值,然后我们使用while循环,在循环中,end的值被更新为nums[end],temp的值被更新为nums[temp]这个循环会一直执行,直到temp的值等于end为止,然后我们返回变量end的值即可

var findDuplicate = function(nums) {
    let start = nums[0];
    let end = nums[0];
    do {
        start = nums[start];
        end = nums[nums[end]];
    } while(start != end)
    let temp = nums[0];
    while(temp !== end) {
        end = nums[end];
        temp = nums[temp];
    }
    return end;
};

坚持努力,无惧未来!