一、题目:
数组中的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表
- 遍历hash,将当前值作为key,如下图。
- 此时key为3,加上k值,k=2,3+2=5,查看map中是否有5,我们发现5在map中已经存在,查找对数+1.
- 依次遍历完所有数并出现如下结果(假设k=2的情况)。、
4.实现
在前面的两数之和的基础上,将目标值移动到左边等于0就转换为了上一次的练习题。二第二种方式采用先排队,然后两边夹击的方式求解。
三、代码:
时间复杂度:O(n )
空间复杂度:O(n)
四、总结
这个题目是前两次,两数之和和三数之和的总结,巩固的这类题目的做题思路。