「这是我参与2022首次更文挑战的第23,活动详情查看:2022首次更文挑战」
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
输出:
解释:差的绝对值为 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 <= nums.length <= 200数组长度较短;1 <= nums[i] <= 100数值为100以内;我们需要从数组nums中找出差值的绝对值为k。值得一说的是我们可以通过Math.abs来求绝对值,下面我们用俩中方法来实现。
1.逐步实现 俩层循环暴力解法
最简单的方法就是通过俩层循环来解决,首先我们先定义ans用于存放差值的绝对值为k的数量。
let ans = 0
通过俩层循环,第二层循环的起始索引需要比第层大1,这样我们就能得到俩个数通过Math.abs就能求出绝对值是否大于k。
for (let i = 0; i < nums.length; i++) {
for (let j = i + 1; j < nums.length; j++) {
if (Math.abs(nums[i] - nums[j]) == k) {
ans++;
}
}
}
1.完整代码 俩层循环暴力解法
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var countKDifference = function(nums, k) {
let ans = 0
for (let i = 0; i < nums.length; i++) {
for (let j = i + 1; j < nums.length; j++) {
if (Math.abs(nums[i] - nums[j]) == k) {
ans++;
}
}
}
return ans;
};
2.逐步实现 map + 一次遍历
首先定义map用于存放当前数值出现的次数,定义ans用于存放符合结果的个数。
let ans = 0
const map = new Map();
通过循环当map对象存在当前值减k或者当前值加k这俩种情况的值是那就使ans加上此值出现的个数,当前每次循环也需要去统计当前值出现的个数。
for (let i = 0; i < nums.length; i++) {
ans = ans + (map.get(nums[i] - k) || 0)
ans = ans + (map.get(nums[i] + k) || 0)
map.set(nums[i], (map.get(nums[i]) || 0) + 1);
}
2.完整代码 map + 一次遍历
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var countKDifference = function(nums, k) {
let ans = 0
const map = new Map();
for (let i = 0; i < nums.length; i++) {
ans = ans + (map.get(nums[i] - k) || 0)
ans = ans + (map.get(nums[i] + k) || 0)
map.set(nums[i], (map.get(nums[i]) || 0) + 1);
}
return ans;
};