题目:
给你一个整数数组 nums
和一个整数 k
,请你返回数对 (i, j)
的数目,满足 i < j
且 |nums[i] - nums[j]| == k
。
示例:
输入: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]
解析:
哈希表+一次遍历即可,先定义一个map,遍历数组,key就是数组中的每个值,分别计算+k和-k在不在数组中,在的话就在几次就累加几次即可。
上面这段话翻译一下就是:我们要满足 |nums[i] - nums[j]| = k,这个公式变一下就是nums[i] = nums[j] + k 和 nums[i] = nums[j] - k。解题方法为定义一个哈希表,在循环遍历的过程中,判断哈希表中的nums[index]+k 和 nums[index]-k 存在的情况下,将值累加到结果中即可
func countKDifference(nums []int, k int) (ans int) {
cnt := map[int]int{}
for _, num := range nums {
ans += cnt[num-k] + cnt[num+k]
cnt[num]++
}
return
}
------------------------------------------------------------------------
补充:实在没理解上面的哈希表方法,还是暴力解吧
func countKDifference(nums []int, k int) int {
res := 0
for i, num1 := range nums {
for _, num2 := range nums[:i] {
if abs(num1, num2) == k {
res++
}
}
}
return res
}
func abs[T int | int64 | float64](a, b T) T {
c := a - b
if c < 0 {
return -c
}
return c
}