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

简介: 本次刷题日记的第 67 篇,力扣题为:532. 数组中的 k-diff 数对,中等

本次刷题日记的第 67 篇,力扣题为:532. 数组中的 k-diff 数对中等

一、题目描述:

image.png

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 个结果即可

image.png

那么我们就要定一个规则,一个 k-diff 数对中,咱们就记录较小的一个即可,避免出现重复计数

如果我们重复计数的话,就会出现如下情况,测试用例会给我们测试出来

image.png

例如上述情况,如果咱们一个数对中当 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)
}

四、总结:

image.png

这种做法,实现起来可能比较傻瓜,但是非常好理解的

我们可以知道时间复杂度是 O(n) ,咱们完整的遍历了题目给出的数组

空间复杂度也是 O(n) ,咱们引入了 2 个 map,占空的空间消耗属于 O(n) 级别

原题地址:532. 数组中的 k-diff 数对

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

欢迎点赞,关注,收藏

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

image.png

好了,本次就到这里

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

我是阿兵云原生,欢迎点赞关注收藏,下次见~



相关文章
|
Cloud Native
【刷题日记】88. 合并两个有序数组
本次刷题日记的第 34 篇,力扣题为:88. 合并两个有序数组 ,简单
|
11月前
|
存储 算法
【LeetCode刷题日志】88.合并两个有序数组
【LeetCode刷题日志】88.合并两个有序数组
【刷题记录】leetcode215 数组中的第K个最大元素
【刷题记录】leetcode215 数组中的第K个最大元素
|
索引 Cloud Native
【刷题日记】954. 二倍数对数组
本次刷题日记的第 21 篇,力扣题为:954. 二倍数对数组 ,中等
|
存储 索引 Cloud Native
【刷题日记】498. 对角线遍历
本次刷题日记的第 65 篇,力扣题为:498. 对角线遍历,中等
|
Cloud Native
【刷题日记】905. 按奇偶排序数组
本次刷题日记的第 46 篇,力扣题为:905. 按奇偶排序数组 ,简单
|
算法
每日一题——数组中重复的数据
每日一题——数组中重复的数据
89 0
每日一题——数组中重复的数据
刷爆leetcode第十二期 0026 数组中数字出现的次数
刷爆leetcode第十二期 0026 数组中数字出现的次数
98 0
刷爆leetcode第十二期 0026 数组中数字出现的次数
|
算法
LeetCode每日一题(19)——数组中重复的数据
数组中重复的数据 1.题目 2.示例 3.思路 4.代码