[LeetCode]532. K-diff Pairs in an Array 解题报告(C++)
题目描述
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].
题目大意
- 输入为数组和 数k
- 找到数组中绝对值为k的(i,j).
- 输出一共有多少对.
- 注意: (i,j)和(j,i)视为一样的
解题思路
方法1:
- 通过统计数组中每个数字的个数和出现次数的映射
- 遍历哈希表
- 若k=0. 如果数字出现字数大于一个,则res++;
- 若k不为0,用当前数字加上k之后得到的新数字若也在数组中,则res++;
代码实现:
class Solution0 {
public:
int findPairs(vector<int>& nums, int k) {
int n = nums.size();
int res = 0;
unordered_map<int, int> m;
for (int x : nums) {
m[x]++;
}
for (auto it : m) {
if (k == 0 && it.second>1) {
res++;
}
if (k > 0 && m.count(it.first+k)) {
++res;
}
}
return res;
}
};
方法2:
- 不使用哈希表.改用双指针
- 给数组排序!
- 遍历数组,找到当前数字之后 和 当前数 差不小于k 的数.
- 若这个数.与二者刚好差为k.则res++;
- 遍历过程注意跳过数字相同
代码实现:
class Solution {
public:
int findPairs(vector<int>& nums, int k) {
int n = nums.size();
sort(nums.begin(), nums.end());
int res = 0;
int i, j = 0;
for (i = 0; i < n; i++) {
j = max(i + 1, j); // 更新索引号.
// 寻找 当前数字后的与当前数字差不小于k的数字
while (j < n && nums[j] - nums[i] < k) {
j++;
}
// 若二者差恰好为k,结果++;
if (j < n&&nums[j] - nums[i] == k) {
++res;
}
// 跳过重复的数字
while (i < n - 1 && nums[i] == nums[i + 1]) {
i++;
}
}
return res;
}
};