532. 数组中的 k-diff 数对
给你一个整数数组 nums
和一个整数 k
,请你在数组中找出 不同的 k-diff
数对,并返回不同的 k-diff
数对 的数目。
k-diff
数对定义为一个整数对 (nums[i], nums[j]
) ,并满足下述全部条件:
- 0 <= i, j < nums.length
- i != j
- |nums[i] - nums[j]| == k
注意,|val|
表示 val
的绝对值。
示例 1:
输入:nums = [3, 1, 4, 1, 5], k = 2
输出:2
解释:数组中有两个 2-diff 数对, (1, 3) 和 (3, 5)。
尽管数组中有两个 1 ,但我们只应返回不同的数对的数量。
示例 2:
输入:nums = [1, 2, 3, 4, 5], k = 1
输出:4
解释:数组中有四个 1-diff 数对, (1, 2), (2, 3), (3, 4) 和 (4, 5) 。
示例 3:
输入:nums = [1, 3, 1, 5, 4], k = 0
输出:1
解释:数组中只有一个 0-diff 数对,(1, 1) 。
提示:
- 1 <= nums.length <= 10^4
- -10^7 <= nums[i] <= 10^7
- 0 <= k <= 10^7
解题思路
Go代码
func findPairs(nums []int, k int) int {
// 将数组排序,排序后,后面的数减去前面的数一定是正数,免去了求绝对值的麻烦,并且可以使用双指针了
if len(nums) == 0 {
return 0
}
sort.Ints(nums)
res := 0
i,j := 0,1
for i < len(nums) && j < len(nums) {
// i在后移过程中可能与j相等,指向同一个数,这时候j也要后移
if i == j || nums[j] - nums[i] < k {
j++ // j后移才能让差值变大
} else if nums[j] - nums[i] > k {
i++
} else { // 找到一个k-diff对
res++
i++
// 同一个数值只能使用一次,所以去重,但是i不能移到j的后面去了,所以还需要i < j的条件
// 移动完后,可能i > j了也没事,会通过后续for的第一个if,j不断后移的
for i < len(nums) && nums[i] == nums[i - 1] {
i++
}
}
}
return res
}