题目描述:

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:

1
2
3
4
5
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:

1
2
3
4
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:

1
2
3
4
Input: [1, 3, 1, 5, 4], k = 0
Output: 1
Explanation: There is one 0-diff pair in the array, (1, 1).

Note:

  1. The pairs (i, j) and (j, i) count as the same pair.
  2. The length of the array won’t exceed 10,000.
  3. All the integers in the given input belong to the range: [-1e7, 1e7].

寻找有多少组差的绝对值等于k的数。先对数组进行排序,然后用双指针从前向后搜索:

  1. 移动右指针,直到左右指针元素之差的绝对值大于等于k;
  2. 再移动左指针,直到左右指针元素之差的绝对值小于k;
  3. 重复1,2步直到右指针到达数组结尾,记录下出现过的k的次数;

为了去重要跳过已经出现的元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
public:
int findPairs(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
int ans = 0;
int p1 = 0, p2 = 1;
int len = nums.size();
if (len < 2) return ans;
while (p1 < len && p2 < len) {
int diff = nums[p2] - nums[p1];
if (diff == k) {
ans++;
do {p1++;} while (p1 < len && nums[p1 - 1] == nums[p1]);
do {p2++;} while (p2 < len && nums[p2 - 1] == nums[p2]);
}
else if (diff < k) {
p2++;
}
else {
p1++;
}
if (p1 >= p2) p2 = p1 + 1;
}
return ans;
}
};