2006. 差的绝对值为 K 的数对数目
题目描述
给你一个整数数组 nums 和一个整数 k ,请你返回数对 (i, j) 的数目,满足 i < j 且 |nums[i] - nums[j]| == k 。
|x| 的值定义为:
- 如果
x >= 0,那么值为x。 - 如果
x < 0,那么值为-x。
示例 1:
输入:nums = [1,2,2,1], k = 1 输出:4 解释:差的绝对值为 1 的数对为: - [1,2,2,1] - [1,2,2,1] - [1,2,2,1] - [1,2,2,1]
示例 2:
输入:nums = [1,3], k = 3 输出:0 解释:没有任何数对差的绝对值为 3 。
示例 3:
输入:nums = [3,2,1,5,4], k = 2 输出:3 解释:差的绝对值为 2 的数对为: - [3,2,1,5,4] - [3,2,1,5,4] - [3,2,1,5,4]
提示:
1 <= nums.length <= 2001 <= nums[i] <= 1001 <= k <= 99
解法
方法一:暴力枚举
思考
\(n \le 200\),枚举全部 \(i<j\) 并判断绝对值是否为 \(k\),次数约 \(2 \times 10^4\),约束允许。值域与 \(k\) 都很小,这一方法不依赖额外结构。
双重循环直接对应题目定义,实现与正确性都直观。
我们注意到,数组 \(nums\) 的长度不超过 \(200\),因此我们可以枚举所有的数对 \((i, j)\),其中 \(i < j\),并判断 \(|nums[i] - nums[j]|\) 是否等于 \(k\),是则答案加一。
最后返回答案即可。
时间复杂度 \(O(n^2)\),空间复杂度 \(O(1)\)。其中 \(n\) 为数组 \(nums\) 的长度。
1 2 3 4 5 6 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
方法二:哈希表或数组
思考
方法一对每个数对都扫描一次,虽能通过,但仍是平方。注意到只需统计差值恰为 \(k\) 的个数,对当前 \(x\),此前出现的 \(x-k\) 与 \(x+k\) 均可配对。
为此边遍历边用计数器累加,再写入 \(x\),避免重复计数且只需线性时间。
我们可以使用哈希表或数组记录数组 \(nums\) 中每个数出现的次数,然后枚举数组 \(nums\) 中的每个数 \(x\),判断 \(x + k\) 和 \(x - k\) 是否在数组 \(nums\) 中,是则答案加上 \(x+k\) 和 \(x-k\) 出现的次数之和。
最后返回答案即可。
时间复杂度 \(O(n)\),空间复杂度 \(O(n)\)。其中 \(n\) 为数组 \(nums\) 的长度。
1 2 3 4 5 6 7 8 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |