1. 程式人生 > >【JS】 存在重複元素 II #陣列 #雜湊表 Easy

【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 提交記錄