LeetCode.2006. 差的绝对值为 K 的数对数目

文章讲述了如何使用两种不同的方法解决编程问题,即找出数组中两数之绝对差值等于给定值k的数对数量。第一种方法是暴力遍历,时间复杂度为O(n^2),第二种方法利用哈希表降低时间复杂度到O(n)。文章强调了哈希表在解决问题中的高效性和数学逻辑的重要性。
摘要由CSDN通过智能技术生成

一、题目

给你一个整数数组 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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/count-number-of-pairs-with-absolute-difference-k
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、代码

思路1:暴力

            第一重遍历选取第一个数a,

            第二重遍历选取第二个数b,

            求|a-b|==k?

            如果是,则count++。

时间复杂度:O(n^2)

空间复杂度:O(1)

#include <math.h>
int countKDifference(int* nums, int numsSize, int k){
    int count = 0;
    for(int i = 0 ; i < numsSize; i++){
        for(int j = i + 1 ; j < numsSize; j++){
            if(abs(nums[i] - nums[j]) == k){
                count++;
            }
        }
    }
    return count
}

思路2:哈希表+遍历计算差值为k的对数

  1. 哈希表记录nums数组中每个元素出现的次数
  2. 差值为k的两个元素a,b,他们各自出现次数的乘积a*b,为差值k的次数,也就是(a,b)和(b,a)出现次数

            例如:[3,5,3,2,1,4,1,2,2],设k = 2

            其中:

                3:2次

                5:1次

                2:3次

                1:2次

                4:1次

            |3 - 5| = k, 那么(3,5)和(5,3)的数对有 2次 * 1次 = 2次

            |3 - 1| = k, 那么(3,1)和(1,3)的数对有 2次 * 2次 = 4次

            |2 - 4| = k, 那么(2,4)和(4,2)的数对有 3次 * 1次 = 3次

            共计有 2 + 4 + 3 = 9(对);

时间复杂度:O(n)

空间复杂度:O(n)

 //利用数组模拟hash表,key = 数组下标 , value = 下标对应的元素
 int hashmap[101];
 //初始化hashmap数组
 for(int i = 0 ; i < 101 ;i++){
     hashmap[i] = 0;
 }
 //统计nums[]中各个元素的次数
 for(int i = 0; i < numsSize; i++){
     int n = nums[i];
     hashmap[n]++;//元素出现次数+1
 }
 int count = 0;
 //统计差值为k的数对个数
 //遍历hashmap,找到相差k的两个数,次数相乘即为对数
 //由于n + k ,n - k会重复统计,这里采用n - k方式,向前找差值为k的key。
 for(int j = k ; j < 101; j++){//为什么从k开始,因为向前找需要 j - k,如果j从0开始,则j-k=-k,数组溢出。
     count += hashmap[j] * hashmap[j - k];
 }
 //同样也可以采用n + k方式,如下:
 // for(int j = 0; j < 101 - k;j++){
 //     count += hashmap[j] * hashmap[j + k];
 // }
 return count;

三、总结

1.哈希表

        哈希表又称为散列表,散列查找技术不是挨个比较记录a[i]与key是”==“还是”!=“,也不是有序表查找那样可以利用a[i]与key的”<"或">"来折半查找。

        哈希表不能采取“比较”的手段来找到元素,而是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。查找时,根据这个确定的对应关系找到对应值key的映射f(key),若查找集合中存在这个记录,则必定在f(key)的位置上。这种对应关系f称为散列函数,又称哈希函数。

        按照这个思想,采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table)。关键字对应的记录存储位置称为散列地址。

2.感悟

        第二种思路不是我想出来的,是看题解的。看完完,我突然有一种感叹,这些思路想不到,并不是其有多难、复杂,而是想不到这个题目各个条件背后隐藏的一些数学关系。就如同这个计算差值为k的数对,我很难想到可以通过计算“差值为k的两个元素其各自次数的乘积”得到。不禁感叹数学逻辑的奇妙和自己的弱小。加油!加油!加油!

### 回答1: 这个错误信息意味着你正在尝试运行一个叫做“leetcode.toggleleetcodecn”的命令,但是系统找不到这个命令。 这可能是因为你使用的软件或工具不支持这个命令,或者这个命令在你当前的上下文中不可用。你可以检查一下你的命令拼写是否正确,或者查看相关的文档和说明来了解如何正确地使用这个命令。 ### 回答2: 当我们在使用LeetCode插件时,可能会遇到错误提示“command 'leetcode.toggleleetcodecn' not found”。这个问题出现的原因是插件没有正确安装或者没有激活。下面是解决这个问题的几个步骤: 1. 确认插件是否安装成功 首先,我们需要确认LeetCode插件是否已经成功安装。可以通过在VS Code的侧边栏中找到“Extensions”图标,然后在搜索框中输入“LeetCode”来查找插件是否存在。如果插件存在,那么就说明安装成功。 2. 确认插件是否已经激活 在安装插件之后,我们还需要激活LeetCode插件才能使用它提供的功能。可以在VS Code的侧边栏中找到“Extensions”图标,然后点击“Installed”选项卡,在LeetCode插件下方看到是否显示“Activate”按钮,如果是,则需要点击该按钮进行激活。 3. 检查配置项是否正确设置 在安装插件并激活之后,LeetCode插件的配置项需要正确设置才能顺利使用。可以在VS Code的右下角找到“Settings”按钮,然后搜索“LeetCode”来找到插件的配置项。在配置页面中可以看到“Language Switch”选项,此处需要确保开启了中文支持。 如果以上三个步骤都已经确认完成,但还是遇到了“command 'leetcode.toggleleetcodecn' not found”这个错误,则可以尝试卸载并重新安装插件,或者尝试咨询LeetCode官方支持团队。 ### 回答3: 这个错误提示是因为在使用LeetCode的插件时,该插件没有被正确加载或安装。在使用该插件之前,需要确保已经按照LeetCode插件的安装步骤正确地安装和配置了插件。 为了解决该问题,可以采取以下步骤: 1. 检查是否已经安装了VS Code和LeetCode插件。如果没有安装,需要按照官方文档的指导进行安装。 2. 确认已经登录了LeetCode账号。在登录成功之后,需要在LeetCode插件的设置中填写正确的账号信息。 3. 检查是否在VS Code的用户设置中配置了相关的设置项。在VS Code的用户设置中,需要添加以下配置项: ```json "leetcode.endpoint": "https://leetcode-cn.com/graphql", "leetcode.defaultLanguage": "javascript", "leetcode.workspaceFolder": "${workspaceFolder}/leetcode", "leetcode.skeletonFileExtension": "js" ``` 4. 如果 LeetCode 插件的版本不是最新版本,则需要更新插件。在VS Code中,可以通过侧边栏中的扩展选项或者运行命令“Extensions: Check for Extension Updates”来升级插件。 5. 如果以上步骤都无效,可以尝试重新安装LeetCode插件,并按照官方文档的指导进行配置和使用。 总之,要解决'leetcode.toggleleetcodecn' not found 错误,需要仔细检查和核对安装、配置、登录等这些步骤,以确保LeetCode插件能够正常工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值