持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情
题目描述
给你一个整数数组 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) 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/k-diff-pairs-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路分析
- 今天的算法题目是数组题目,题目自定义了k-diff 数对,需要满足0 <= i, j < nums.length i != j,|nums[i] - nums[j]| == k。
- 根据上述条件,我们无须对数组排序。在求 k-diff 数组的过程中,|nums[i] - nums[j]| == k 转换成两数之和的题目,求解思路类似,为了避免重复,我们使用 hashSet 记录访问过的元素。实现代码如下,供参考。
通过代码
class Solution {
public int findPairs(int[] nums, int k) {
Set<Integer> visited = new HashSet<Integer>();
Set<Integer> res = new HashSet<Integer>();
for (int num : nums) {
if (visited.contains(num - k)) {
res.add(num - k);
}
if (visited.contains(num + k)) {
res.add(num);
}
visited.add(num);
}
return res.size();
}
}
总结
- 上述算法的时间复杂度是O(n),空间复杂度是O(n)。
- HashSet 和 HashMap 都是我们常用的 Hash 结构, 两者常常拿来一起比较,其中HashMap实现了Map接口,存储的是键值对。HashSet实现了set接口,存储的是对象。我们要区分清楚,灵活使用。
- 坚持算法每日一题,加油!