ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

LeetCode-Go 题解:1037. Valid Boomerang(有效回旋镖)几何判定与 Go 实现

2026/9/12 9:52:32 拓冰建站 浏览量
LeetCode-Go 题解:1037. Valid Boomerang(有效回旋镖)几何判定与 Go 实现 LeetCode-Go 题解1037. Valid Boomerang有效回旋镖几何判定与 Go 实现【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go导读本文围绕 LeetCode 1037 题「Valid Boomerang有效回旋镖」展开讲解如何用 Go 语言判断平面上的三个点是否构成回旋镖三点各不相同且不在同一直线上。文章以仓库中 leetcode/1037.Valid-Boomerang/README.md 的解题思路为骨架结合该目录下的源码实现与单元测试深入剖析「用叉积代替斜率、用乘法规避除零」的几何判定技巧。读完本文你将掌握回旋镖判定的两种等价数学模型斜率法与叉积法、单行 Go 实现的内在原理以及如何在当前仓库中运行测试进行验证。题目描述Aboomerangis a set of 3 points that are all distinct andnotin a straight line.Given a list of three points in the plane, return whether these points are a boomerang.Example 1:Input: [[1,1],[2,3],[3,2]] Output: trueExample 2:Input: [[1,1],[2,2],[3,3]] Output: falseNote:points.length 3points[i].length 20 points[i][j] 100题目大意回旋镖Boomerang定义为一组三个点这些点各不相同且不在一条直线上。题目给出平面上三个点组成的列表要求判断这些点是否可以构成回旋镖。满足以下任一情况都返回false三个点中存在两个或三个点坐标完全相同三个点共线位于同一条直线上。解题思路思路一斜率比较法直觉版三个点 A(x1, y1)、B(x2, y2)、C(x3, y3) 不在同一直线上等价于「AB 的斜率」与「AC 的斜率」不相等即(y2 - y1) / (x2 - x1) ! (y3 - y1) / (x3 - x1)但直接使用斜率有两个隐患除零问题当x2 x1或x3 x1两点连线垂直于 x 轴时分母为 0程序会崩溃或产生NaN必须先做额外分支判断浮点误差若改用浮点数计算比较相等性时可能引入精度问题。思路二叉积法仓库采用的做法把「斜率相等」的除法比较改写成「交叉相乘」的乘法比较(y2 - y1) * (x3 - x1) (y3 - y1) * (x2 - x1)等式成立说明三点共线等式不成立说明三点构成回旋镖。交叉相乘后不再涉及除法自然规避了分母为 0 的情况也避免了浮点精度问题代码可以压缩成一行。更深一层叉积的几何本质仓库解法实际计算的是向量 AB 与向量 AC 的叉积外积的 z 分量E (x1 - x2) * (y1 - y3) - (x1 - x3) * (y1 - y2)展开后恰好等于x1(y2 - y3) x2(y3 - y1) x3(y1 - y2)这正是「鞋带公式Shoelace Formula」给出的三角形 ABC 有向面积的两倍。因此E ! 0三角形面积非零三点不共线构成回旋镖E 0三点共线不构成回旋镖。从源码结构看leetcode/1037.Valid-Boomerang/1037. Valid Boomerang.go 中的单行实现正是基于这一几何事实对 A 点是否恰为坐标原点并无依赖三个点的角色可以任意轮换。值得注意的另一个细节题目要求「三个点各不相同」。当任意两个点重合时例如 A 与 B 重合则向量 AB 为零向量其与 AC 的叉积必为 0表达式返回false。也就是说单行叉积判断隐式地同时处理了「点重合」与「三点共线」两种非法情况无需单独编写去重逻辑。代码实现仓库中 leetcode/1037.Valid-Boomerang/1037. Valid Boomerang.go 的原始实现如下package leetcode func isBoomerang(points [][]int) bool { return (points[0][0]-points[1][0])*(points[0][1]-points[2][1]) ! (points[0][0]-points[2][0])*(points[0][1]-points[1][1]) }其中points是[][]intpoints[i]表示第 i 个点的[x, y]坐标。为便于阅读可以将单行代码改写为等价的、带注释的写法语义完全一致package leetcode func isBoomerang(points [][]int) bool { // 取三个点 A、B、C 的坐标 x1, y1 : points[0][0], points[0][1] x2, y2 : points[1][0], points[1][1] x3, y3 : points[2][0], points[2][1] // 向量 AB 与向量 AC 的叉积两倍有向面积 // 非零 三点不共线 构成回旋镖 cross : (x1-x2)*(y1-y3) - (x1-x3)*(y1-y2) return cross ! 0 }两种写法完全等价原版把减法项移到不等号右侧等价于判断叉积是否非零。复杂度分析时间复杂度O(1)。只对固定 3 个点做常数次加减乘运算与输入规模无关空间复杂度O(1)。仅使用常数个临时变量未开辟任何与坐标相关的辅助空间。由于题目约束0 points[i][j] 100坐标差最大为 100叉积中间结果最大约 10⁴在 Go 的int范围内不会溢出可以放心使用整数运算。测试验证仓库在 leetcode/1037.Valid-Boomerang/1037. Valid Boomerang_test.go 中提供了表驱动风格的单元测试Test_Problem1037覆盖两个用例输入期望输出说明[[1,2],[2,3],[3,2]]true三点构成三角形是回旋镖[[1,1],[2,2],[3,3]]false三点落在直线 y x 上共线第二个用例与 README 中的 Example 2 一致[[1,1],[2,2],[3,3]]输出false第一个用例是 README 中 Example 1 的一个变体坐标略有不同但同样不共线输出true可见测试数据在保持题意的基础上做了多样化处理。在当前仓库根目录下可以运行以下命令验证实现与测试# 仅运行本题所在的包的测试 go test ./leetcode/1037.Valid-Boomerang/ -v # 运行全部题解包的测试并生成覆盖率文件 coverage.txt bash gotest.sh其中 gotest.sh 使用go test -covermodeatomic -coverprofilecoverage.txt ./leetcode/...一次性对leetcode目录下所有题解包收集覆盖率测试文件中的fmt.Printf输出会打印每个用例的输入与isBoomerang的实际返回值便于人工核对。边界情况与易错点垂直直线如[[0,0],[0,1],[0,2]]三点同在 x 轴上此时斜率法分母为 0但叉积法返回false共线判定正确点重合如[[1,1],[1,1],[2,3]]两个点完全相同叉积恒为 0返回false符合「三点各不相同」的要求坐标含 0 与边界值 100叉积法不依赖坐标正负对边界值同样成立不要用浮点斜率做相等比较除法引入的舍入误差可能让本应相等的斜率被判为不等而纯整数叉积比较是精确的。小结Valid Boomerang 是几何判定类题目的经典入门题。仓库给出的 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),仅供参考