0
点赞
收藏
分享

微信扫一扫

[备考算法练习]6 数组中的k-diff数对


一、题目:

​​数组中的k-diff数对​​

给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对。这里将 k-diff 数对定义为一个整数对 (i, j), 其中 i 和 j 都是数组中的数字,且两数之差的绝对值是 k.

示例 1:

输入:[1, 2, 3, 4, 5], k = 1
输出: 4
解释: 数组中有四个 1-diff 数对, (1, 2), (2, 3), (3, 4) (4, 5)
输入: [1, 3, 1, 5, 4], k = 0
输出: 1
解释: 数组中只有一个 0-diff 数对,(1, 1)

二、题解:1.解读

已知目标值,遍历数据找出两个数,且和为目标值。首先想到的就是暴力求解,也可以排序后二分,更好的方法也可以用Hash求解。

2.思路1

和前面咱们练习的"两数之和"有相似的地方,方法一是通过暴力,两层循环O(n*n)方式完成,这里就不赘述了哈。

3.思路2

利用两数之间的关系。比如A-B=K,A=B+K和B=A-K;那什么数据结构方便我们这样的操作呢?这里引入<span style="color: #ff0000;">​hash表​</span>,我们将数组元素A存放于hash表中,再查看A-K是否也在表中,如果在就满足条件累加,否则继续遍历。下面具体阐述一下。

  • 初始化hash表

[备考算法练习]6 数组中的k-diff数对_hash表

  • 遍历hash,将当前值作为key,如下图。

[备考算法练习]6 数组中的k-diff数对_初始化_02

  • 此时key为3,加上k值,k=2,3+2=5,查看map中是否有5,我们发现5在map中已经存在,查找对数+1.

[备考算法练习]6 数组中的k-diff数对_初始化_03

  • 依次遍历完所有数并出现如下结果(假设k=2的情况)。、

[备考算法练习]6 数组中的k-diff数对_hash表_044.实现

在前面的两数之和的基础上,将目标值移动到左边等于0就转换为了上一次的练习题。二第二种方式采用先排队,然后两边夹击的方式求解。

三、代码:[备考算法练习]6 数组中的k-diff数对_hash表_05

时间复杂度:O(n )

空间复杂度:O(n)

四、总结

这个题目是前两次,两数之和和三数之和的总结,巩固的这类题目的做题思路。

举报

相关推荐

0 条评论