【JS】数组中的K-diff数对 #数组 #双指针

给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对。这里将 k-diff 数对定义为一个整数对 (i, j), 其中 i 和 j 都是数组中的数字,且两数之差的绝对值是 k.

输入: [3, 1, 4, 1, 5], k = 2 ,输出: 2 , 解释: 数组中有两个 2-diff 数对, (1, 3) 和 (3, 5)。
输入: [1, 2, 3, 4, 5], k = 1 ,输出: 4


解法一:

使用两个 for 循环,用循环一下标 为 i 的数字减循环二下标为 j 的数字,结果等于 k 就 count +=1,

同时,把 nums [i] 和 nums [j] 存入map ,避免重复计数

时间复杂度 O(n^2)

var findPairs = function(nums, k) {
        var count=0, countArr={} ,max,min ,key
        for(var i=0;i<nums.length;i++){
            for(var j=i+1;j<nums.length;j++){

                max= nums[i]>nums[j] ? nums[i] : nums[j]
                min= nums[i]<nums[j] ? nums[i] : nums[j]
                if(max-min==k){
                   
                    key=max+'-'+min;

                    if(countArr[key]==1) continue;
                    count++
                    countArr[key]=1                     
                }
            }
        }

    return count;

};

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


解法二:

while() 循环,使用双指针,

不过看起来更慢了…


var findPairs = function(nums, k) {

        var count=0, countArr={} ,max,min,key ,len=nums.length
        var left=0,right=len;

        while(left<=len-1){

            right--
            max= nums[left]>nums[right] ? nums[left] : nums[right]
            min= nums[left]<nums[right] ? nums[left] : nums[right]            
            if(right==left) {
                left++
                right=len
            }else if( max - min == k ){
                key=max+'-'+min;
                if(countArr[key]!=1) {
                count++
                countArr[key]=1
                }
            }
        }
    return count;

};

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


解法三:

排序,

使数组排序,然后用两层循环,当子循环的 nums[j] 减第一层循环的 nums[i] 大于 k 时,就跳出子循环。

时间复杂度,最好情况下大概是 O(nlogN)

var findPairs = function(nums, k) {

    nums=nums.sort(sortName)
    var count=0, countArr={} ,max,min,key ,len=nums.length,mid
    
    for(var i=0;i<len;i++){
        for(var j=i+1;j<len;j++){
            if(nums[j]-nums[i]==k){
                key=nums[j]+'-'+nums[i];
                if(countArr[key]!=1) {
                    count++
                    countArr[key]=1
                }
            }else if(nums[j]-nums[i]>k){
                break;
            }
        }
    }
        
    return count;
};

var sortName=function(a,b){return a-b}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值