前端算法-查找对应元素

71 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第29天,点击查看活动详情

题目

给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。

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

思路一

我们在函数中先判断当前形参是否为null或者形参nums的长度为0,满足其中一个条件直接返回false,如果不满足则继续往下执行,我们声明一个map变量,他的值是一个Map数据结构实例,我们接下来使用循环对形参nums进行循环,在循环中我们用currentNum变量记录当前循环的值,然后使用if语句进行判断,判断条件为使用Map数据的结构的has方法获取currentNum变量值存在于map变量中且i变量-使用get方法在map变量中获取到currentNum变量的属性值小于或等于k,如果满足则返回true,不满足就将当前循环值和i使用Map数据结构的set方法添加到map变量中,如果循环完成没有返回true则直接返回false即可

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {boolean}
 */
var containsNearbyDuplicate = function(nums, k) {
    if (nums == null || nums.length === 0) {
        return false
    }
    let map = new Map()
    for (let i = 0; i < nums.length; i++) {
        let currentNum = nums[i]
        if (map.has(currentNum) && i - map.get(currentNum) <= k) {
            return true
        }
        map.set(nums[i], i)
    }
    return false
};

思路二

这里我们还可以使用双重for循环进行实现,在循环中判断后面的值和前面的值,如果数量是一样的且后面的下标比前面的下标大且后面的下标减去前面的下标是小于等于k那么我们就返回为true,否则就返回false

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {boolean}
 */
let containsNearbyDuplicate = function(nums, k) {
    for (let i=nums.length-1;i>=0;i--) {
        for (let j = 0 ; j<nums.length;j++){
            if (nums[i]===nums[j]&&j<i&&i-j<=k){
                return true;
            }
        }
    }
    return false
};