【JS】 存在重复元素 II #数组 #哈希表 Easy

给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。

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



解法一:

使用2个 for 循环超时了,因为时间复杂度是 O(n^2) ,特别是数组 nums 非常大 而 k 等于 nums.length-2时,执行时间会非常长。

最终使用1个 for 循环加 IndexOf() 查找,总算通过了。不过看效率好像也不高啊


var containsNearbyDuplicate = function(nums, k) {

    for( var i=0;i<nums.length;i++) {
        var pos = nums.indexOf(nums[i],i+1)
        if(pos==-1){
            continue;
        }else if(pos<=i+k){
            return true;
        }
    }
return false;
};

执行用时:2292 ms
已经战胜 20.91 % 的 javascript 提交记录


解法二:

使用哈希表,var hash={key1:8 , key2: 10}

哈希表的 key = i , val=数组索引,当前索引 i 减去哈希表的索引 val 小于等于 k,返回 true

意想不到竟然速度比前面快落么多。


var containsNearbyDuplicate = function(nums, k) {

    var hash={}
    for( var i=0;i<nums.length;i++) {

        if(hash[nums[i]]==undefined){
            hash[nums[i]]=i
        }else if(i-hash[nums[i]]>k){
            hash[nums[i]]=i
        }else{
            return true;
        }
            // console.log(hash)
    }
return false;
};

执行用时:100 ms
已经战胜 82.51 % 的 javascript 提交记录

猜你喜欢

转载自blog.csdn.net/sphinx1122/article/details/84575495