【刷题日记】532. 数组中的 k-diff 数对

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

本次刷题日记的第 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 数对

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是小魔童哪吒,欢迎点赞关注收藏,下次见~

猜你喜欢

转载自juejin.im/post/7110215891261849613