
LeetCode-Go 题解 1304双指针对称构造「和为 0 的 n 个互不相同整数」【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go导读本文围绕 LeetCode-Go 仓库中 1304. Find N Unique Integers Sum up to Zero 一题的完整题解展开讲解如何用「正负配对、双指针从两端填充」的思路在 O(n) 时间内构造出任意一个由 n 个互不相同的整数组成、且元素之和为 0 的数组。读完本文你不仅能掌握该题的标准解法与边界处理还能结合仓库内的源码与测试用例理解 LeetCode-Go 项目题解 100% 测试覆盖的工程化组织方式并学会如何在本仓库中运行单个题目的单元测试。题目返回 n 个互不相同且和为 0 的整数原题英文描述如下出处题目文档Given an integern, returnanyarray containingnuniqueintegers such that they add up to 0.中文题意给你一个整数n请你返回任意一个由n个互不相同的整数组成的数组并且这n个数的和为 0。题目有两个硬性约束条件元素必须互不相同unique即数组中不能出现重复值所有元素之和为 0数组长度恰好为n返回任意一组满足条件的数组即可题目允许多个正确答案。Constraints约束1 n 1000示例分析多解的体现与边界情况题解文档给出了三个示例示例 1Input: n 5 Output: [-7,-1,1,3,4] Explanation: These arrays also are accepted [-5,-1,1,2,3] , [-3,-1,2,-2,4].当n 5时[-7,-1,1,3,4]、[-5,-1,1,2,3]、[-3,-1,2,-2,4]都是合法答案——它们都满足5 个互不相同的整数且和为 0。这印证了题目只要求返回任意一组解而非唯一解。示例 2Input: n 3 Output: [-1,0,1]-1 0 1 0且三个数互不相同合法。示例 3Input: n 1 Output: [0]当n 1时唯一的合法答案就是[0]——单个元素自身和为 0且只有一个元素自然互不相同。解题思路正负成对、左右对称填充题解文档给出的核心思路非常简洁给出一个数 n输出一个有 n 个数的数组里面元素之和为 0。简单题简单循环即可。其背后的数学原理值得展开说明对于偶数 n构造n/2对形如(k, -k)的相反数对即可。每一对相加为 0全部配对相加自然也为 0且k与-k互不相同对于奇数 n除上述成对的相反数外再在中间填入一个0。0不影响总和且与任何k、-k都不重复从源码实现看具体的填充方式采用了双指针从数组两端向中间逼近的策略left指针从下标 0 向右移动right指针从下标n-1向左移动每次循环把递增的start放到左端、把-start放到右端直到两指针相遇left right时结束。当n为奇数时两指针会在正中间相遇该位置默认保持零值0恰好满足奇数场景的构造需求。这种正负成对、对称放置的构造法充分利用了相反数相加为 0 的代数性质避免了排序、查重等额外开销。核心实现逐行解读仓库源码题解文档给出的参考代码如下与仓库源码 1304. Find N Unique Integers Sum up to Zero.go 完全一致func sumZero(n int) []int { res, left, right, start : make([]int, n), 0, n-1, 1 for left right { res[left] start res[right] -start start left left 1 right right - 1 } return res }逐行拆解如下行代码作用1res, left, right, start : make([]int, n), 0, n-1, 1分配长度为n的结果切片零值切片元素默认为 0left指向最左下标right指向最右下标start从 1 开始递增2for left right循环条件左右指针未相遇未越过时持续填充3res[left] start在左侧位置写入正数start4res[right] -start在右侧位置写入相反数-start二者配对和为 05start下一个配对使用更大的数值保证全数组元素互不相同6res[left] ...前的指针移动left右移一位、right左移一位继续填充内层位置7return res返回结果若n为奇数正中间未被写入的位置保持 0天然满足和为 0 的要求这里有一个值得注意的细节正数从小到大1、2、3…放在左半部分对应的负数从大到小-1、-2、-3…放在右半部分因此结果数组本身就保持了一定的对称有序性例如n 5时输出[-3,-1,0,1,2]这种形态实际取决于配对数量与中间零值的位置关系同样是一组合法解。复杂度分析时间复杂度O(n)。双指针循环恰好执行⌊n/2⌋次每次常数时间操作空间复杂度O(n)。需要分配长度为n的结果切片用于返回题目要求返回整个数组此空间为必要开销。除此之外循环仅使用常数个额外变量left、right、start不含额外辅助结构。由于 n 的上限仅为 1000该解法在时间和空间上都极为充裕是最优量级的实现。测试验证仓库中的单元测试证据LeetCode-Go 项目为每道题配套了单元测试文件本题的测试位于 1304. Find N Unique Integers Sum up to Zero_test.go采用题目参数 期望答案结构化的表驱动测试模式question1304/para1304/ans1304覆盖了以下输入输入 n期望输出示例答案5[-7,-1,1,3,4]0[]空切片3[-1,0,1]1[0]其中n 0是超出题目约束1 n 1000的额外边界测试此时make([]int, 0)得到空切片循环条件left right即0 -1直接不成立函数返回[]行为符合 Go 切片语义。这一用例说明仓库对边界情况做了防御性覆盖。从gotest.sh可以看到项目通过如下命令对全部 leetcode 题解做原子覆盖率统计go test -covermodeatomic -coverprofilecoverage.txt ./leetcode/...因此你可以在仓库根目录模块名github.com/halfrost/LeetCode-GoGo 版本要求 1.19见 go.mod单独运行本题测试验证实现正确性go test -v ./leetcode/1304.Find-N-Unique-Integers-Sum-up-to-Zero/其他可行的构造方案题目明确允许多解因此除上述正负成对 中间补 0的对称构造法外从数学性质出发还存在等价构造思路仓库当前未收录仅作思路拓展前缀抵消法依次放入1, 2, ..., n-1最后一个位置放入-(12...n-1) -n(n-1)/2总和为 0。当n ≥ 3时该末位值与前面的正整数均不同也满足唯一性要求区间平移法任取一组和为 0 的基础解如对称构造的结果整体加上/减去同一常数会破坏和为 0 的性质因此不可直接平移但可以理解为任意组合⌊n/2⌋对相反数奇数时补 0都是合法解。无论采用哪种构造核心都是利用相反数对相加为 0这一最朴素的代数事实这也是本题作为简单题Easy的精髓所在。小结通过本题可以复习三个要点构造题的通用套路当题目要求和为 0且元素互异时成对相反数 奇数补 0是最直接的构造模板双指针的应用场景用left/right从两端向中间填充天然为奇数长度留下中间零值位置代码简洁且不易出错工程化的题解组织在 LeetCode-Go 仓库中每道题都遵循题目编号.题目名/目录下存放README.md含题目、思路、代码 同名.go源码 同名_test.go测试的规范见 1304 题目录配合gotest.sh的全量覆盖率统计形成了可阅读、可验证、可持续扩展的题解体系适合作为刷题与 Go 语法学习的参考素材。【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考