LeetCode 469 凸多边形


文章目录

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

摘要

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

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

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

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

描述

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

你的任务是判断:

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

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

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

注意几个隐藏前提:

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

题解答案

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

用叉积判断转向方向

具体思路是:

  1. 对每三个连续的点(A, B, C)
  2. 计算向量ABBC的叉积
  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)

总结

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

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

  • 如何把“形状判断”转化成“方向一致性判断”
  • 如何用一个简单的数学工具(叉积)解决工程问题
  • 如何写出既严谨又能容忍真实数据噪声的代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1131110.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

强烈安利!10款AI论文软件测评,研究生毕业论文必备

强烈安利&#xff01;10款AI论文软件测评&#xff0c;研究生毕业论文必备 2026年AI论文工具测评&#xff1a;为何值得一看&#xff1f; 随着人工智能技术的不断进步&#xff0c;AI论文工具已成为研究生撰写毕业论文的重要辅助。然而&#xff0c;面对市场上琳琅满目的产品&#…

GEO服务商如何选择?2026年1月权威推荐榜单发布

随着生成式人工智能技术在搜索领域的深度渗透&#xff0c;生成式引擎优化&#xff08;GEO&#xff09;已成为企业数字化转型战略的核心构成。2026年&#xff0c;国内GEO服务市场迎来技术从验证走向规模化落地的关键节点&#xff0c;企业对具备AI算法适配、全链路服务、合规安全…

乡村振兴新工具:基于AI的图像生成技术助农应用

乡村振兴新工具&#xff1a;基于AI的图像生成技术助农应用 作为一名驻村工作者&#xff0c;我深刻体会到农民朋友在推广特色农产品时面临的困境——专业设计资源匮乏&#xff0c;宣传图制作成本高昂。最近我尝试了"乡村振兴新工具&#xff1a;基于AI的图像生成技术助农应用…

低成本实验:学生党如何用云端GPU体验阿里通义Z-Image-Turbo

低成本实验&#xff1a;学生党如何用云端GPU体验阿里通义Z-Image-Turbo 作为一名对AI图像生成技术感兴趣的高中生&#xff0c;你是否曾因家庭电脑性能不足而无法体验最新的AI绘图工具&#xff1f;阿里通义Z-Image-Turbo作为一款高性能图像生成模型&#xff0c;能够快速生成高质…

java.lang.IllegalArgumentException:那个最容易被忽略,却最该被重视的异常

网罗开发&#xff08;小红书、快手、视频号同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…

Python高级编程技术深度解析与实战指南

Python 高级编程技术深度解析与实战指南 Python 作为一门强大而灵活的编程语言&#xff0c;其高级特性允许开发者编写更高效、可维护和优雅的代码。本指南基于 Python 3.12 版本&#xff0c;聚焦于核心高级技术&#xff0c;包括装饰器、生成器与迭代器、元编程、上下文管理器、…

跨平台AI绘画解决方案:随时随地访问你的Z-Image-Turbo工作区

跨平台AI绘画解决方案&#xff1a;随时随地访问你的Z-Image-Turbo工作区 作为一名自由职业者&#xff0c;我经常需要在不同设备间切换工作&#xff0c;从家里的台式机到咖啡馆的笔记本&#xff0c;甚至偶尔用平板应急处理需求。最让我头疼的就是AI绘画环境的部署——每次换设备…

新员工上手时间缩短50%的实践:AIDF如何加速知识传承

【引言】企业管理者常面临这样的痛点&#xff1a;核心骨干离职&#xff0c;带走了宝贵的项目经验&#xff1b;新员工入职&#xff0c;面对海量的共享文件夹和混乱的版本号&#xff0c;陷入“找文档难、问人难、上手慢”的困境。据统计&#xff0c;传统模式下新员工培训周期往往…

周末项目:用Z-Image-Turbo和云端GPU打造你的个人AI画展网站

周末项目&#xff1a;用Z-Image-Turbo和云端GPU打造你的个人AI画展网站 作为一名前端开发者&#xff0c;你是否曾想过在自己的个人网站上展示独特的AI生成艺术作品&#xff1f;Z-Image-Turbo作为阿里通义实验室开源的6B参数图像生成模型&#xff0c;仅需8步即可快速生成高质量图…

遗产数字化:用预训练模型快速修复老照片的实践

遗产数字化&#xff1a;用预训练模型快速修复老照片的实践 作为一名家谱研究者&#xff0c;我经常遇到一个棘手的问题&#xff1a;手头的老照片因为年代久远而出现各种破损&#xff0c;比如划痕、褪色、折痕等。这些照片承载着家族记忆&#xff0c;但传统的修复方法要么成本高昂…

AI+AR实战:快速构建混合现实内容生成管道

AIAR实战&#xff1a;快速构建混合现实内容生成管道 混合现实&#xff08;MR&#xff09;技术正在改变我们与数字世界互动的方式&#xff0c;而AI生成内容的加入让这一体验更加丰富。本文将带你了解如何快速构建一个混合现实内容生成管道&#xff0c;解决XR开发团队在实时生成符…

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

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

告别“黑盒优化”:SHEEP-GEO以五维模型破解GEO效果迷思,成企业战略伙伴

2026年GEO优化市场格局与企业选型指南2026年&#xff0c;中国GEO&#xff08;生成式引擎优化&#xff09;市场迎来爆发式增长&#xff0c;行业预测显示市场规模将突破520亿元&#xff0c;同比增幅超190%。这一增长背后&#xff0c;是AI平台用户渗透率的快速提升——DeepSeek、豆…

独立游戏开发:快速集成AI生成的角色立绘

独立游戏开发&#xff1a;快速集成AI生成的角色立绘 作为一名独立游戏开发者&#xff0c;你是否遇到过这样的困境&#xff1a;想要为角色设计多种表情和姿势&#xff0c;却受限于美术资源不足&#xff1f;现在&#xff0c;借助AI图像生成技术&#xff0c;你可以快速测试不同风格…

Node.js全栈实战:构建基于天远多头借贷行业风险版API的BFF风控层

解决风控数据“最后一公里”的传输难题 在开发贷超导流页、信用卡申请 H5 或消费分期小程序时&#xff0c;前端面临着巨大的挑战&#xff1a;业务需要实时展示用户的信用评估状态&#xff08;如“审核中”、“极速放款”或“暂不符合”&#xff09;&#xff0c;但直接将包含数百…

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

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

走进汽车大脑:深度解析车企主控芯片motor_controller.c代码

著名车企汽车级平台主控芯片&#xff0c;电机控制器源码 &#xff0c;代码风格极好在智能驾驶时代&#xff0c;汽车已经不再是简单的代步工具&#xff0c;而是变成了移动的智能终端。作为汽车最核心部件之一的主控芯片&#xff0c;在这个转型过程中扮演着关键角色。今天&#x…

在 iPhone 上进行 iOS 网络抓包的实践经验

iPhone 手机上的网络包&#xff0c;并不是在接口联调阶段&#xff0c;而是在一些只发生在真机、只发生在特定网络条件下的问题上。 模拟器一切正常&#xff0c;日志也没异常&#xff0c;但线上用户就是能把问题复现出来。 这类问题&#xff0c;如果只停留在代码和日志层面&…

云端GPU+预置镜像:30分钟构建你的AI图像生成平台

云端GPU预置镜像&#xff1a;30分钟构建你的AI图像生成平台 作为一名刚接触AI图像生成的小团队开发者&#xff0c;你是否遇到过这些困扰&#xff1a;想快速验证一个AI绘图应用的概念&#xff0c;却被复杂的GPU环境搭建、模型部署和依赖安装劝退&#xff1f;本文将带你使用预置镜…

一键复现论文结果:基于阿里通义Z-Image-Turbo的图像生成研究环境配置

一键复现论文结果&#xff1a;基于阿里通义Z-Image-Turbo的图像生成研究环境配置 作为一名研究生&#xff0c;复现论文结果是科研工作中不可或缺的环节。最近我在复现一篇关于图像风格迁移的论文时&#xff0c;遇到了环境配置不兼容的难题。经过多次尝试&#xff0c;我发现使用…