难度:【中等】
给定一个整数数组和一个整数 k,你需要在数组里找到不同的 k-diff 数对。这里将 k-diff 数对定义为一个整数对 (i, j),其中 i 和 j 都是数组中的数字,且两数之差的绝对值是 k 。
示例:
示例 1:
输入:[3, 1, 4, 1, 5], k = 2 输出:2 解释:数组中有两个 2-diff 数对, (1, 3) 和 (3, 5)。 尽管数组中有两个1,但我们只应返回不同的数对的数量。 示例 2:
输入:[1, 2, 3, 4, 5], k = 1 输出:4 解释:数组中有四个 1-diff 数对, (1, 2), (2, 3), (3, 4) 和 (4, 5)。 示例 3:
输入:[1, 3, 1, 5, 4], k = 0 输出:1 解释:数组中只有一个 0-diff 数对,(1, 1)。 示例 4:
输入:nums = [1,2,4,4,3,3,0,9,2,3], k = 3 输出:2 示例 5:
输入:nums = [-1,-2,-3], k = 1 输出:2
提示:
1 <= nums.length <= 10
4-10
7 <= nums[i] <= 10
70 <= k <= 10
7
解题思路:
方法1:排序+双指针+HashSet
先排序,再使用双指针依次判断两数之差和K的关系,并使用hashset去重即可
代码实现:
class Solution {
public int findPairs(int[] nums
, int k
) {
Arrays
.sort(nums
);
int i
= 0,j
= 1;
Set
<Integer> set1
= new HashSet<>();
Set
<Integer> set2
= new HashSet<>();
int count
= 0;
while(j
< nums
.length
&& i
< j
) {
int diff
= nums
[j
] - nums
[i
];
if (diff
< k
) {
j
++;
}else if(diff
> k
) {
i
++;
if (i
== j
) j
++;
}else {
if (!set1
.contains(nums
[i
]) && !set2
.contains(nums
[j
])) {
count
++;
set1
.add(nums
[i
]);
set2
.add(nums
[j
]);
}
i
++;
j
++;
}
}
return count
;
}
}
方法2:HashMap
先使用哈希表存储所有数及其出现次数。
如果k等于0,直接统计出现次数大于1的数的个数即可。否则,判断每个数 num 是否存在对应的 num + k 即可。
代码实现:
class Solution {
public int findPairs(int[] nums
, int k
) {
if (k
< 0) {
return 0;
}
int count
= 0;
Map
<Integer, Integer> map
= new HashMap<>();
for (int num
: nums
) {
map
.put(num
, map
.getOrDefault(num
,0)+1);
}
if (k
== 0) {
for (int num
: map
.keySet()) {
if (map
.get(num
) > 1) {
count
++;
}
}
} else {
for (int num
: map
.keySet()) {
if (map
.containsKey(num
+ k
)) {
count
++;
}
}
}
return count
;
}
}