2006. 差的绝对值为 K 的数对数目(2022-2-9)
给你一个整数数组 nums
和一个整数 k
,请你返回数对 (i, j)
的数目,满足 i < j
且 |nums[i] - nums[j]| == k
。
|x|
的值定义为:
- 如果
x >= 0
,那么值为x
。 - 如果
x < 0
,那么值为-x
。
示例 1:
输入:nums = [1,2,2,1], k = 1
输出:4
解释:差的绝对值为 1 的数对为:
- [1,2,2,1]
- [1,2,2,1]
- [1,2,2,1]
- [1,2,2,1]
示例 2:
输入:nums = [1,3], k = 3
输出:0
解释:没有任何数对差的绝对值为 3 。
示例 3:
输入:nums = [3,2,1,5,4], k = 2
输出:3
解释:差的绝对值为 2 的数对为:
- [3,2,1,5,4]
- [3,2,1,5,4]
- [3,2,1,5,4]
提示:
1 <= nums.length <= 200
1 <= nums[i] <= 100
1 <= k <= 99
解题思路
一个是暴力模拟(两层循环),一个是哈希记录(一层循环)
// 暴力模拟
var countKDifference = function(nums, k) {
let len = nums.length,ret =0
for(let i = 0; i < len; i++){
for(let j = i + 1;j < len; j++){
if(Math.abs(nums[i]-nums[j]) == k) ret++
}
}
return ret
};
哈希:我们记录每一个遍历到的值,并查询此值之前是否有满足要求的另一个值,hash.get(nums[i]+-k)
,如果存在这样的值,就把它出现的次数累加到结果上,否则,将以0计算。
// 哈希表
var countKDifference = function(nums, k) {
let len = nums.length, ret =0
let hash = new Map()
for(let i = 0; i < len; i++ ){
ret += (hash.get(nums[i]-k) || 0) + (hash.get(nums[i]+k) || 0)
hash.set(nums[i], (hash.get(nums[i]) || 0) + 1)
}
return ret
};