本次刷题日记的第 67 篇,力扣题为:532. 数组中的 k-diff 数对,中等
一、题目描述:
K-diff 数对什么呢?我们一起来了解并学习一下吧
二、这道题考察了什么思想?你的思路是什么?
K-diff 数对都讲述了哪些重点信息并要求我们做些啥:
- 题目给出一个数组,数组中的元素是整数,并给出了一个 k 值
- 题目讲述 k-diff 数对就是从数组中找出任意两个数,差值的绝对值是等于 k 的,那么就找到了 1 对 k-diff 数对
- 题目要求我们,找出符合条件的所有数对
分析
例如题目中示例
nums = [3, 1, 4, 1, 5], k = 2
我们可以知道数对有 (1,3) ,(3,5)
我们知道上述的 2 个 k-diff 数对,例如 3 - k = 1 , 1 是存在于数组中的,因此我们将 3 记录下了
当然,我们也可以看到 1+k = 3, 因为 3 是存在于数组中的,因此我们将 1 记录下来,我们发现这其实就是做重复了
因此,对于这中情况,我们只能记录其中 1 个结果即可
那么我们就要定一个规则,一个 k-diff 数对中,咱们就记录较小的一个即可,避免出现重复计数
如果我们重复计数的话,就会出现如下情况,测试用例会给我们测试出来
例如上述情况,如果咱们一个数对中当 num + k = 数组中存在的数,就记录 num,num-k=数组中存在的数,就记录 num
那么 咱们就会记录 (1,4) 一次,(0,3) 两次
因此,咱们接下来就看选用什么样的数据结构来实现了,
我们可以选用 map 来记录咱们的结果,因为,题目给出的数据中,是会存在很多重复的情况的,因此我们可以使用 hash 表来进行去重,使用另外一个 hash 表记录是否遍历到过
接下来,就可以来实现如下编码了
三、编码
根据上述逻辑和分析,我们就可以翻译成如下代码
此处需要注意,一个k-diff 数对,涉及 2 个数组,但是只能记 1 对
编码如下:
func findPairs(nums []int, k int) int { v, res := make(map[int]struct{}, 0), make(map[int]struct{}, 0) for _, num := range nums { if _,ok := v[num - k]; ok { res[num-k] = struct{}{} } if _,ok := v[num+k]; ok { res[num] = struct{}{} } v[num] = struct{}{} } return len(res) }
四、总结:
这种做法,实现起来可能比较傻瓜,但是非常好理解的
我们可以知道时间复杂度是 O(n) ,咱们完整的遍历了题目给出的数组
空间复杂度也是 O(n) ,咱们引入了 2 个 map,占空的空间消耗属于 O(n) 级别
原题地址:532. 数组中的 k-diff 数对
今天就到这里,学习所得,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~