2026/4/16 18:44:39
网站建设
项目流程
php做网站用什么软件,奥迪汽车建设网站,七牛云存储wordpress,怎么做网站文件文章目录摘要描述题解答案题解代码分析题解代码分析#xff08;深入讲讲思路#xff09;为什么使用平方距离#xff1f;为什么需要用字典统计#xff1f;为什么是 count * (count - 1)#xff1f;示例测试及结果示例 1示例 2示例 3时间复杂度O(n)空间复杂度O(n)总结摘要
…文章目录摘要描述题解答案题解代码分析题解代码分析深入讲讲思路为什么使用平方距离为什么需要用字典统计为什么是 count * (count - 1)示例测试及结果示例 1示例 2示例 3时间复杂度O(n²)空间复杂度O(n)总结摘要这一题是典型的几何 哈希表计数问题属于 LeetCode 算法里的中等偏简单类型。但真正理解它的本质会让你在之后处理“点对点距离分类”“组合数计算”这类题时变得非常轻松。题目要求我们统计二维平面里的所有“回旋镖”数量。只要三个点中的两个点与中心点的距离一样而且顺序不同算不同就能形成一个有效的回旋镖。我们会从直觉出发用一种非常贴近开发者思维的方式讲清楚解法并给出 Swift 可运行 Demo 代码。描述你会拿到一个 n 个点组成的数组每个点是[x, y]。如果从一个点 i 出发有两个不同的点 j、k 到它的距离相同那么(i, j, k)就构成一个回旋镖而且顺序不同的是不同的回旋镖。比如points [[0,0],[1,0],[2,0]]以(1,0)为中心点和(0,0)距离是 1和(2,0)距离也是 1所以(1,0) - (0,0) - (2,0)和(1,0) - (2,0) - (0,0)都是回旋镖总共2 个。题解答案核心逻辑很简单选一个点作为“中心点 i”计算它到所有其他点的距离把相同距离的点统计在一起比如对 i 来说有 3 个点距离都相同假设某个距离下有m个点这些点能构成m * (m - 1)个回旋镖因为(i, j, k)和(i, k, j)都算合法然后把所有 i 当作中心点统计即可。题解代码分析下面给出的 Swift 代码是可直接运行的版本。importFoundationclassSolution{funcnumberOfBoomerangs(_points:[[Int]])-Int{letnpoints.countifn3{return0}varresult0foriin0..n{vardistanceCount[Int:Int]()forjin0..n{ifij{continue}letdxpoints[i][0]-points[j][0]letdypoints[i][1]-points[j][1]letdistdx*dxdy*dy// 用平方距离即可distanceCount[dist,default:0]1}// 对每个距离进行组合计数for(_,count)indistanceCount{ifcount1{resultcount*(count-1)}}}returnresult}}// MARK: - Demo 代码可运行letsolutionSolution()print(示例 1,solution.numberOfBoomerangs([[0,0],[1,0],[2,0]]))// 2print(示例 2,solution.numberOfBoomerangs([[1,1],[2,2],[3,3]]))// 2print(示例 3,solution.numberOfBoomerangs([[1,1]]))// 0题解代码分析深入讲讲思路为什么使用平方距离我们并不需要开方因为只要相等即可平方距离能减少浮点误差也让计算更快。为什么需要用字典统计因为以某个点 i 为中心我们要知道和它距离相同的点数量是多少例如 i 到三个不同点距离为 5count 3 可构成 3 * 2 6 个回旋镖 (i,j,k), (i,k,j) ... 等为什么是count * (count - 1)因为这是排列数不是组合。顺序不同算不同题目强调了元组顺序重要。示例测试及结果示例 1输入[[0,0],[1,0],[2,0]] 输出2 解释 中心点 (1,0) 和其他两个点距离相等 所以 (i,j,k)、(i,k,j) 两种排列示例 2输入[[1,1],[2,2],[3,3]] 输出2 解释 所有点呈现对角线方向 每个点与其他两点等距斜率一致示例 3输入[[1,1]] 输出0 解释单点无法构成任何回旋镖以上示例已包含在 Demo 代码里可直接运行验证。时间复杂度O(n²)原因对每个点 i共有 n 个遍历所有点 j每次 n 次总共 n² 操作空间复杂度O(n)因为我们用一个字典记录与中心点的距离统计最坏情况下记录 n−1 个距离。总结这道题看似几何题其实本质是“基于中心点的等距离分组 排列数统计”属于非常典型的哈希计数思想。你可以从这题总结几个通用技巧只要是几何题里要求判断距离是否相等就用平方距离代替真正距离。当题目中顺序重要时通常是排列问题count * (count - 1)是常客。对每个点单独作为中心点做统计是一种很高效的枚举方式。在实际工程里如果你在做地图平台、运动分析、用户定位聚类、甚至是某些推荐系统的空间距离处理时这类“距离分类统计”的思想都能派上用场。