给定一个整数数组和一个整数 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 提交记录