「这是我参与2022首次更文挑战的第14天,活动详情查看: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
输出: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
题解
暴力解法
最简单的暴力解法,双重循环遍历整个数组,将每一个数一对一拿出来判断相减的绝对值会不会等于 k:
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var countKDifference = function(nums, k) {
let ans = 0
let n = nums.length
for (let i = 0; i < n; ++i) {
for (let j = i + 1; j < n; ++j) {
if (Math.abs(nums[i] - nums[j]) == k) {
ans++;
}
}
}
return ans
};
利用哈希表优化时间复杂度到 O(n) - 一次遍历
我们可以转化一下思路,不是去找两个相相减绝对值等于 k 的数,而是在遍历到一个数的时候,我们可以去找一下,它和谁相减的绝对值会等于 k,然后将每次遍历到的数存入一个哈希表,这样在之后碰到满足条件的数,就可以来表中查找到它的个数,然后就只需要设置一个 ans 将所有满足情况的次数相加起来就ok了:
var countKDifference = function(nums, k) {
let ans = 0;
let n = nums.length;
const map = new Map();
for (let j = 0; j < n; ++j) {
ans += (map.get(nums[j] - k) || 0) + (map.get(nums[j] + k) || 0);
map.set(nums[j], (map.get(nums[j]) || 0) + 1);
}
return ans;
};