题目

类型:哈希表
image.png

解题思路

对于每个t = nums[j] 而言,是要找与其相对差值为 k 且下标比其小的数(即 t - k 和 t + k),可以采取边遍历边记录某个数出现次数,从而将复杂度优化到 O(n)。

再利用数据范围 1 <= nums[i] <= k,可以直接使用数组充当哈希表。

代码解析(自己):
1、cnts数组用于保存每个数字在数组中出现次数(代表不同位置的同一数字)
2、t - k >= 1 表示当前遍历到的数字t和差值k 相比t比k大且差值至少是1,比如差值是1,当前遍历数字为2
3、t + k <= 100 表示当前遍历到的数字t和差值k 二者相加小于等于100,意味着当前遍历的数字存在一种可能,那就是它有另一对比他大的数字,在数组最大范围100内
比如

  • 数字t为2,差值k为1,那么 2-1 = 1 ,当前遍历的数字2就存在1可以与它结为一对 (1,2)
  • 数字t为2,差值k为1,那么 2+1 = 3 <= 100,当前 历的数字2就存在3可以与它结为一对 (2,3)

4、题目要求返回数对 (i, j) 的数目,满足 i < j
这一点代码中ans += cnts[t - k]ans += cnts[t + k] 就可以做到,因为每次遍历到当前元素的时候,都是取前面遍历过的统计数量,一定能满足i<j

代码

  1. class Solution {
  2. public int countKDifference(int[] nums, int k) {
  3. int[] cnts = new int[110];
  4. int n = nums.length, ans = 0;
  5. for (int i = 0; i < n; i++) {
  6. int t = nums[i];
  7. if (t - k >= 1) ans += cnts[t - k];
  8. if (t + k <= 100) ans += cnts[t + k];
  9. cnts[t]++;
  10. }
  11. return ans;
  12. }
  13. }