Swift 实战:判断点集是否关于某条直线对称(LeetCode 356)
文章目录
- 摘要
- 描述
- 示例 1
- 示例 2
- 提示
- 题解答案
- 题解代码分析
- 示例测试及结果
- 输出结果
- 时间复杂度
- 空间复杂度
- 总结
摘要
对称性是我们在生活中常常看到的现象:镜子里的自己,湖水中的倒影,建筑物的设计美学……在数学和算法里,“对称”同样有重要的应用。LeetCode 356 提出了这样一个问题:给定一组点,判断它们是否能被一条垂直于 y 轴的直线对称。
这题看似小巧,但却考察了我们对几何直观的理解和对哈希集合的灵活运用。本文将从题目描述出发,用 Swift 编写一个完整的解决方案,并附带一个可运行的 Demo,带你感受代码如何模拟“照镜子”的过程。
描述
题目要求如下:
给定一组点 points
,每个点的坐标形式为 [x, y]
。请判断这些点是否能关于某一条垂直的直线对称。
换句话说,如果存在一条直线 x = k
,那么对于集合里的每一个点 (x, y)
,在另一侧必须存在对应的点 (2k - x, y)
。
示例 1
输入: points = [[1,1],[-1,1]]
输出: true
解释: 它们关于 x = 0 这条直线对称。
示例 2
输入: points = [[1,1],[-1,-1]]
输出: false
解释: 无论画哪条垂直直线,都无法让两个点对称。
提示
1 <= points.length <= 10^4
-10^4 <= points[i][0], points[i][1] <= 10^4
题解答案
我们要找的直线 必须是竖直线,也就是 x = k
的形式。如何判断是否存在这样的 k?
-
找出最小 x 和最大 x
如果这些点是关于某条竖直线对称的,那么这条线一定在minX
和maxX
的中间。
即k = (minX + maxX) / 2.0
。 -
逐个检查点是否有“镜像点”
对于每个点(x, y)
,它的镜像点应该是(2k - x, y)
。
如果所有点的镜像都存在,那么这些点就是对称的。 -
用哈希集合快速查找
将所有点放入集合中(使用字符串"x,y"
表示),检查是否存在对应镜像点。
题解代码分析
下面是 Swift 的完整实现:
import Foundationclass Solution {func isReflected(_ points: [[Int]]) -> Bool {var minX = Int.maxvar maxX = Int.minvar pointSet = Set<String>()// Step 1: 找最小和最大 x,并存储点集for p in points {minX = min(minX, p[0])maxX = max(maxX, p[0])pointSet.insert("\(p[0]),\(p[1])")}// 中心线位置let sum = minX + maxX// Step 2: 检查每个点是否有镜像点for p in points {let mirror = "\(sum - p[0]),\(p[1])"if !pointSet.contains(mirror) {return false}}return true}
}
示例测试及结果
让我们写几个测试用例:
func testIsReflected() {let solution = Solution()let case1 = [[1,1],[-1,1]]print("输入: \(case1), 输出:", solution.isReflected(case1)) // truelet case2 = [[1,1],[-1,-1]]print("输入: \(case2), 输出:", solution.isReflected(case2)) // falselet case3 = [[2,3],[4,3],[6,3],[8,3]]print("输入: \(case3), 输出:", solution.isReflected(case3)) // true (关于 x = 5 对称)let case4 = [[0,0],[1,0],[2,0]]print("输入: \(case4), 输出:", solution.isReflected(case4)) // false
}testIsReflected()
输出结果
输入: [[1, 1], [-1, 1]], 输出: true
输入: [[1, 1], [-1, -1]], 输出: false
输入: [[2, 3], [4, 3], [6, 3], [8, 3]], 输出: true
输入: [[0, 0], [1, 0], [2, 0]], 输出: false
可以看到,我们的算法完美模拟了“照镜子”的对称检查逻辑。
时间复杂度
- 遍历所有点:O(n)
- 每次查找镜像点:O(1)(哈希集合查找)
总时间复杂度:O(n)
空间复杂度
- 存储所有点:O(n)
总空间复杂度:O(n)
总结
这道题看似简单,但核心思路是:找出对称轴的位置,再验证所有点是否存在镜像点。
实际应用场景:
- 在 图像处理 里,可以用这个逻辑检查图形是否对称。
- 在 数据可视化 中,可以快速检测某些点的分布特征。
- 在 几何建模 中,这种检查对称性的方式非常实用。
关键 takeaway:
- 对称问题的关键在于“轴”或“中心”的确定。
- 哈希集合是快速验证镜像存在性的利器。
- 多维坐标常用字符串/元组来作为哈希 key。