当前位置: 首页 > news >正文

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?

  1. 找出最小 x 和最大 x
    如果这些点是关于某条竖直线对称的,那么这条线一定在 minXmaxX 的中间。
    k = (minX + maxX) / 2.0

  2. 逐个检查点是否有“镜像点”
    对于每个点 (x, y),它的镜像点应该是 (2k - x, y)
    如果所有点的镜像都存在,那么这些点就是对称的。

  3. 用哈希集合快速查找
    将所有点放入集合中(使用字符串 "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。
http://www.xdnf.cn/news/1323685.html

相关文章:

  • Effective C++ 条款48:认识模板元编程
  • 【前端面试题】JavaScript 核心知识点解析(第一题到第十三题)
  • 【Python语法基础学习笔记】条件表达式和逻辑表达式
  • 03.文件管理和操作命令
  • 网站服务器使用免费SSL证书安全吗?
  • 免费又强大的 PDF 编辑器 ——PDF XChange Editor
  • MacOS 安全机制与“文件已损坏”排查完整指南
  • 【Tech Arch】Spark为何成为大数据引擎之王
  • 算法题打卡力扣第26. 删除有序数组中的重复项(easy))
  • Linux 中断机制深度分析
  • 【轨物交流】轨物科技与华为鲲鹏生态深度合作 光伏清洁机器人解决方案获技术认证!
  • nuScence数据集
  • 特种行业许可证识别技术:通过图像处理、OCR和结构化提取,实现高效、准确的许可证核验与管理
  • Android Cutout(屏幕挖孔)详解
  • Python day48.
  • 【笔记ing】考试脑科学 脑科学中的高效记忆法
  • OCR库pytesseract安装保姆级教程
  • Zephyr下控制ESP32S3的GPIO口
  • 飞算JavaAI家庭记账系统:从收支记录到财务分析的全流程管理方案
  • 上下文切换及线程操作相关内容
  • 微信小程序通过uni.chooseLocation打开地图选择位置,相关设置及可能出现的问题
  • 开放最短路径优先协议
  • Python装饰器:从入门到精通
  • QNX 性能分析工具(hogs pidin tracelogger)
  • IOPaint 远程修图:cpolar 内网穿透服务实现跨设备图片编辑
  • Less (CSS 预处理器)
  • 贪心算法(Greedy Algorithm)详解
  • html页面打水印效果
  • 跨平台RTSP播放器深度对比:开源方案与商业SDK的取舍之道
  • 无人机迫降模式技术要点解析