1、题目
Given an array of integers and an integer k, you need to find the number of unique k-diff pairs in the array. Here a k-diff pair is defined as an integer pair (i, j), where i and j are both numbers in the array and their absolute difference is k.
Example 1:
Input: [3, 1, 4, 1, 5], k = 2 Output: 2 Explanation: There are two 2-diff pairs in the array, (1, 3) and (3, 5). Although we have two 1s in the input, we should only return the number of unique pairs.
Example 2:
Input:[1, 2, 3, 4, 5], k = 1 Output: 4 Explanation: There are four 1-diff pairs in the array, (1, 2), (2, 3), (3, 4) and (4, 5).
Example 3:
Input: [1, 3, 1, 5, 4], k = 0 Output: 1 Explanation: There is one 0-diff pair in the array, (1, 1).
Note:
- The pairs (i, j) and (j, i) count as the same pair.
- The length of the array won't exceed 10,000.
- All the integers in the given input belong to the range: [-1e7, 1e7].
题目大意就是从给出的数组中选出一个pair,其中pair里面的差的值的绝对值为k,且pair里面的值都是数组里面的值。一共有多少个这样不同的pair。
2、思路
(1)用一个set集合保存当前数组里面出现的数字,遍历set集合,查看是否有能和当前数字配合成pair的。(k = 0时需要单独处理,排序后进行数组遍历,找到当前数组重复数字的个数)
(2)用一个map维护每个数字出现的次数。
3、注意点
题目说的是absolute difference, 因此要考虑k为负数的情况,此时应该直接返回0
4、代码
(1)思路1
class Solution {
public int findPairs(int[] nums, int k) {
if (nums == null || nums.length == 0 || k < 0){
return 0;
}
int result = 0;
if (k == 0){
Arrays.sort(nums);
int index = 0;
while(index < nums.length){
if (index + 1 < nums.length && nums[index + 1] == nums[index]){
result++;
while(index + 1 < nums.length && nums[index + 1] == nums[index]){
index++;
}
}
else{
index++;
}
}
return result;
}
Set<Integer> set = new HashSet<>();
for(Integer num : nums){
set.add(num);
}
Iterator<Integer> iterator = set.iterator();
while(iterator.hasNext()){
Integer value = iterator.next();
if(set.contains(value + k)){
result++;
}
}
return result;
}
}
(2)思路2
class Solution {
public int findPairs(int[] nums, int k) {
if (nums == null || nums.length == 0 || k < 0){
return 0;
}
Map<Integer, Integer> map = new HashMap<>();
for (Integer num : nums){
map.put(num, map.getOrDefault(num, 0) + 1);
}
int result = 0;
for (Map.Entry<Integer, Integer> entry : map.entrySet()){
Integer key = entry.getKey();
Integer value = entry.getValue();
if (k == 0 && value > 1){
result++;
}
else if (k != 0 && map.containsKey(key + k)){
result++;
}
}
return result;
}
}