news 2026/10/26 6:19:00

LeetCode 469 凸多边形

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 469 凸多边形


文章目录

    • 摘要
    • 描述
      • 什么是凸多边形,用人话说就是:
    • 题解答案
    • 题解代码分析
    • 题解代码分析
      • 为什么用叉积?
      • 为什么只关心“符号”,不关心大小?
      • 为什么要跳过 `cross == 0`?
      • `% n` 是干嘛的?
    • 示例测试及结果
      • 示例 1:凸多边形
      • 示例 2:凹多边形
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

《凸多边形》是一道看起来很数学,其实很工程的题。

它不考复杂公式,也不要求你会高等几何,真正的核心只有一个:

所有拐弯方向是不是一致的

如果你写过地图路径、UI 绘制、图形编辑器、甚至简单的碰撞检测,这道题的思想你大概率已经用过,只是没意识到它叫“凸多边形判断”。

描述

题目给你一组点points,表示一个多边形的顶点,顶点是按顺序给出的(顺时针或逆时针都可以)。

你的任务是判断:

这个多边形是不是凸多边形

什么是凸多边形,用人话说就是:

  • 任意一条边往内看,不会凹进去
  • 从任意一个顶点转弯,转向方向始终一致
  • 不会出现“左转一下,右转一下”的情况

注意几个隐藏前提:

  • 点的数量 ≥ 3
  • 不需要考虑自交(题目默认是合法多边形)
  • 不要求严格凸(共线允许)

题解答案

这道题的经典解法来自一个非常实用的几何思想:

用叉积判断转向方向

具体思路是:

  1. 对每三个连续的点(A, B, C)
  2. 计算向量AB和BC的叉积
  3. 记录叉积的符号(正 or 负)
  4. 只要中途出现方向不一致,立刻返回false

如果所有拐弯方向都一致,那它一定是凸多边形。

题解代码分析

下面是完整的 Swift 实现,可以直接在 LeetCode 或 Playground 里运行。

classSolution{funcisConvex(_points:[[Int]])->Bool{letn=points.countifn<3{returnfalse}varprevCross=0foriin0..<n{letp0=points[i]letp1=points[(i+1)%n]letp2=points[(i+2)%n]letcross=crossProduct(p0,p1,p2)ifcross!=0{ifprevCross!=0&&cross*prevCross<0{returnfalse}prevCross=cross}}returntrue}privatefunccrossProduct(_a:[Int],_b:[Int],_c:[Int])->Int{letx1=b[0]-a[0]lety1=b[1]-a[1]letx2=c[0]-b[0]lety2=c[1]-b[1]returnx1*y2-y1*x2}}

题解代码分析

为什么用叉积?

叉积在二维空间里有一个非常好用的特性:

  • 结果 > 0 :逆时针转(左转)
  • 结果 < 0 :顺时针转(右转)
  • 结果 = 0 :三点共线

也就是说,它本质是在回答一个问题:

从 A → B → C,是往哪边拐?

为什么只关心“符号”,不关心大小?

因为这道题只在乎方向是否一致:

  • 全是左转 → 凸
  • 全是右转 → 凸
  • 左右混着来 → 凹

至于拐得多猛,完全不重要。

为什么要跳过cross == 0?

ifcross!=0{...}

这是为了允许共线点的存在。

现实中非常常见,比如:

  • UI 边框上多给了几个点
  • 地图边界是直线拆成多段

只要方向不反转,就依然是凸的。

% n是干嘛的?

points[(i+1)%n]

这是为了让最后一个点能和第一个、第二个点组成一组,形成一个“闭环”。

多边形一定是闭合的,这一步非常关键。

示例测试及结果

示例 1:凸多边形

letsolution=Solution()print(solution.isConvex([[0,0],[0,1],[1,1],[1,0]]))

这是一个标准正方形:

  • 每一次转向方向一致
  • 输出:
true

示例 2:凹多边形

print(solution.isConvex([[0,0],[0,10],[10,10],[5,5],[10,0]]))

中间有一个点明显往里凹:

  • 转向方向发生变化
  • 输出:
false

时间复杂度

只遍历了一次数组,每次做常数计算:

O(n)

空间复杂度

只使用了少量变量,没有额外数据结构:

O(1)

总结

《凸多边形》是一道非常值得记住思路的几何题。

它教会你的不是几何公式,而是:

  • 如何把“形状判断”转化成“方向一致性判断”
  • 如何用一个简单的数学工具(叉积)解决工程问题
  • 如何写出既严谨又能容忍真实数据噪声的代码
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 8:04:14

【JavaEE初阶】告别小白!Java IO 流读写 + 文件操作实战

【JavaEE初阶】告别小白&#xff01;Java IO 流读写 文件操作实战 Java IO 是 JavaEE 开发的基础核心&#xff0c;掌握它就能轻松处理文件读写、网络数据传输等操作。本指南针对初学者&#xff0c;从零开始讲解 File 类文件操作 和 IO 流读写&#xff0c;重点结合实战示例&am…

作者头像 李华
网站建设 2026/10/21 8:04:14

基于Vue的学生作业管理系统3u509(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末

系统程序文件列表系统功能学生,教师,课程类型,课程信息,课程资料,学生作业,作业提交,作业批改开题报告内容基于Vue的学生作业管理系统开题报告一、研究背景与意义1.1 研究背景在教育信息化快速发展的背景下&#xff0c;传统作业管理模式依赖纸质作业和人工批改&#xff0c;存在…

作者头像 李华
网站建设 2026/10/23 1:37:04

导师不会告诉你的9款AI论文神器,AIGC率低至13%!

90%的学生都在为论文查重和AI率超标而焦虑&#xff0c;却不知道有些工具能将AIGC率轻松压到13%以下。这篇文章&#xff0c;我将揭露那些学术圈“秘而不宣”的智能工具&#xff0c;以及如何巧妙利用它们&#xff0c;让你的论文写作效率翻倍&#xff0c;同时完美避开学术风险。 从…

作者头像 李华
网站建设 2026/10/23 12:15:57

服务器数据恢复—服务器常见故障解析,数据恢复常规流程完整曝光

服务器数据恢复到底是一个什么样的流程&#xff1f; 服务器数据丢失后&#xff0c;进行数据恢复前应该做哪些准备&#xff1f; 服务器出现故障后应该如何操作才能避免数据被二次破坏&#xff1f;常见的服务器故障包括&#xff1a;磁盘阵列内多块硬盘离线导致服务器崩溃&#xf…

作者头像 李华
网站建设 2026/10/23 16:45:04

欧姆龙CP1H与2台三菱变频器Modbus RTU通讯那些事儿

欧姆龙cp1h与2台三菱变频器modbus rtu通讯程序。 程序有注释。 用的电脑在线模拟&#xff0c;选的威纶通mt8102ip&#xff0c;如果是真实触摸屏只需更改com口和买一根威纶通与欧姆龙232的通讯线即可。 控制正反转、状态显示、写入频率、加减速时间和读取频率、电流、输出电压&a…

作者头像 李华