给你一个整数数组 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 <= 200
1 <= nums[i] <= 100
1 <= k <= 99
提示 1
Can we check every possible pair?
提示 2
Can we use a nested for loop to solve this problem?
解法1:两数之和 + 两次遍历
两数之和 的 同类题型:
LeetCode 2563. 统计公平数对的数目-CSDN博客
LeetCode 2824. 统计和小于目标的下标对数目-CSDN博客
LeetCode 1248. 统计「优美子数组」-CSDN博客
LeetCode 930. 和相同的二元子数组-CSDN博客
class Solution {
public int countKDifference(int[] nums, int k) {
Arrays.sort(nums);
int ans = 0;
for (int i = 0; i < nums.length - 1; i++) {
int right = i + 1;
while (right < nums.length && nums[right] - nums[i] <= k) {
if (nums[right] - nums[i] == k) {
ans++;
}
right++;
}
}
return ans;
}
}
复杂度分析
- 时间复杂度:O(n^2),n 是 数组nums 的长度。数组排序时间复杂度:O(nlogn)。总的时间复杂度:O(nlogn) + O(n^2) = O(n^2)。
- 空间复杂度:O(1)。
解法2:两数之和 + 哈希表 + 一次遍历
class Solution {
public int countKDifference(int[] nums, int k) {
int ans = 0;
Map<Integer, Integer> map = new HashMap<>();
map.put(nums[0], 1);
for (int j = 1; j < nums.length; j++) {
// 枚举j,找到nums[i] = nums[j] + k 或 nums[i] = nums[j] - k 的i的nums[i]个数
ans += map.getOrDefault(nums[j] + k, 0);
ans += map.getOrDefault(nums[j] - k, 0);
map.merge(nums[j], 1, Integer::sum);
}
return ans;
}
}
复杂度分析
- 时间复杂度:O(n),n 是 数组nums 的长度。
- 空间复杂度:O(n), n 是 数组nums 的长度。