LeetCode-Go 题解:532. K-diff Pairs in an Array —— 哈希表统计唯一差对的高效解法 📅 发布时间:2026/9/12 1:56:43 👁 浏览次数: LeetCode-Go 题解532. K-diff Pairs in an Array —— 哈希表统计唯一差对的高效解法【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go本篇技术指南围绕 LeetCode 第 532 题「K-diff Pairs in an Array」展开基于本仓库 LeetCode-Go 的 Go 语言实现讲解如何利用哈希表map统计数组中绝对差为 K 的唯一整数对数量。读完本文你将掌握 k0 与 k0 两种情形的统一处理思路、边界条件的正确防护以及对应 Go 源码的实现细节与测试验证方法可直接复用到同类「唯一配对计数」类问题中。题目描述给定一个整数数组nums和一个整数k需要找出数组中唯一的 k-diff 数对的数量。这里 k-diff 数对被定义为一对整数(i, j)其中i和j都是数组中的数字且它们的绝对差等于k。示例 1Input: [3, 1, 4, 1, 5], k 2 Output: 2 Explanation: There are two 2-diff pairs in the array, (1, 3) and (3, 5). Although we have two 1s in the input, we should only return the number of unique pairs.虽然数组中出现了两个1但只应统计唯一的数对因此(1, 3)只计数一次最终结果只有(1, 3)和(3, 5)两对。示例 2Input:[1, 2, 3, 4, 5], k 1 Output: 4 Explanation: There are four 1-diff pairs in the array, (1, 2), (2, 3), (3, 4) and (4, 5).示例 3Input: [1, 3, 1, 5, 4], k 0 Output: 1 Explanation: There is one 0-diff pair in the array, (1, 1).当k 0时要求两个数字相等且值相同(1, 1)正是利用了数组中重复出现的两个1。注意事项数对(i, j)和(j, i)视为同一个数对数组长度不会超过 10,000输入中的所有整数都位于范围[-1e7, 1e7]内。题目大意给定一个数组在数组里面找到几组不同的 pair 对每个 pair 对相差 K。问能找出多少组这样的 pair 对。核心难点在于「不同」唯一二字重复出现的数字、以及顺序相反的数对都不能重复计数。解题思路这一题可以用 map 记录每个数字出现的次数。重复的数字也会因为唯一的 key不用担心某个数字会被判断多次。整体流程如下第一次遍历用哈希表m统计数组中每个数字的出现次数第二次遍历遍历 map 的每一个 key每个数字都加上 K 以后判断字典里面是否存在如果存在countK 0 特判K 0的情况需要单独判断此时应检查字典中该元素的频次是否大于 1即存在至少两个相同数字如果m[key] 1count也需要。以k 0为例只遍历 map 的 key 而非原始数组天然去掉了重复 key 的干扰——例如示例 1 中数组[3, 1, 4, 1, 5]里出现了两次1但 map 中1只作为一个 key 存在因此(1, 3)不会因两个1被重复计数两次。源码实现精讲本仓库的 Go 实现位于 解题源码package leetcode func findPairs(nums []int, k int) int { if k 0 || len(nums) 0 { return 0 } var count int m : make(map[int]int, len(nums)) for _, value : range nums { m[value] } for key : range m { if k 0 m[key] 1 { count continue } if k 0 m[keyk] 0 { count } } return count }该实现严格遵循了上述思路可以逐段拆解1. 前置防护第 4-6 行if k 0 || len(nums) 0 { return 0 }两个提前返回条件k 0绝对差恒为非负数k为负数时不可能存在任何满足条件的数对直接返回 0避免了后续 map 查询的逻辑歧义len(nums) 0空数组不可能构成数对同样直接返回 0。2. 频次统计第 8-11 行m : make(map[int]int, len(nums)) for _, value : range nums { m[value] }预先用len(nums)指定 map 容量减少扩容带来的开销。m[value]同时完成「首次出现初始化为 1」和「再次出现累加」两种语义。3. 唯一数对计数第 12-20 行for key : range m { if k 0 m[key] 1 { count continue } if k 0 m[keyk] 0 { count } }关键点分析遍历对象是map 的 key 集合而非原始数组这保证每个不同的数字值只被当作「较小的那个数」处理一次从而天然满足「(i, j)与(j, i)视为同一数对」的要求k 0分支只有频次m[key] 1才说明数组中存在两个相同值可以组成(x, x)数对continue避免落入下面的k 0分支k 0分支对每个 key 查询key k是否存在m[keyk] 0存在即构成数对(key, keyk)。由于绝对差对称性key与keyk只会以「较小值 → 较大值」的方向被访问一次不会重复计数。关于负数的处理题目约束整数范围包含负数[-1e7, 1e7]。实现中只做「key k是否存在」的查询并不依赖数值的正负因此负数 key 同样能正确匹配。例如nums [-3, -1]、k 2时遍历到 key-3查询m[-1]存在计数成功。复杂度分析维度复杂度说明时间复杂度O(n)第一次遍历数组统计频次 O(n)第二次遍历 map 的 key 集合最多 O(n)整体线性空间复杂度O(n)哈希表最多存储 n 个不同的 key从源码结构看该实现没有排序操作相比「排序 双指针」的常规思路在时间复杂度上更优且代码更短、逻辑更直观。测试验证仓库为本题提供了完整的单元测试测试文件。测试采用表驱动风格定义question532、para532、ans532结构体分别承载题目、参数与期望答案type question532 struct { para532 ans532 } type para532 struct { one []int n int } type ans532 struct { one int }已启用的测试用例与预期输出如下输入数组k期望输出[3, 1, 4, 1, 5]22[1, 2, 3, 4, 5]14[1, 3, 1, 5, 4]01[]空数组30其中第三个用例覆盖了k 0的特判分支第四个用例覆盖了空数组的边界防护与源码中第 4-6 行的前置判断形成闭环验证。运行测试在仓库根目录执行针对单个题目的测试go test -v ./leetcode/0532.K-diff-Pairs-in-an-Array/ -run Test_Problem532测试通过后会打印输入与输出的对照信息------------------------Leetcode Problem 532------------------------ 【input】:[3 1 4 1 5] 【output】:2 【input】:[1 2 3 4 5] 【output】:4 【input】:[1 3 1 5 4] 【output】:1 【input】:[] 【output】:0仓库根目录的 gotest.sh 脚本展示了全量测试与覆盖率收集的标准做法对全部 leetcode 题目执行go test -covermodeatomic -coverprofilecoverage.txt ./leetcode/...题目的 Go 模块声明位于 go.modmodule github.com/halfrost/LeetCode-GoGo 1.19本地直接go test即可运行。小结K-diff Pairs 一题的核心价值在于「去重」的建模用哈希表把原始数组折叠成「值 → 频次」的键值集合然后以 key 为最小单位做配对查询既规避了重复数字的干扰又天然处理了数对方向性带来的重复计数。k 0时的频次特判与k 0、空数组的前置防护则是这道题最容易踩坑的两个边界。理解这一思路后同类「数组中唯一配对计数」类问题例如仓库中同样基于 map 计数的 0217.Contains-Duplicate、0219.Contains-Duplicate-II 等题目都可以举一反三。【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考