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

力扣算法题:平分正方形(算法小白每日一题)

题号:面试题16.13 平分正方形

题目内容:

给定两个正方形及一个二维平面。请找出将这两个正方形分割成两半的一条直线。假设正方形顶边和底边与 x 轴平行。

每个正方形的数据square包含3个数值,正方形的左下顶点坐标[X,Y] = [square[0],square[1]],以及正方形的边长square[2]。所求直线穿过两个正方形会形成4个交点,请返回4个交点形成线段的两端点坐标(两个端点即为4个交点中距离最远的2个点,这2个点所连成的线段一定会穿过另外2个交点)。2个端点坐标[X1,Y1][X2,Y2]的返回格式为{X1,Y1,X2,Y2},要求若X1 != X2,需保证X1 < X2,否则需保证Y1 <= Y2

若同时有多条直线满足要求,则选择斜率最大的一条计算并返回(与Y轴平行的直线视为斜率无穷大)。

示例:

输入:square1 = {-1, -1, 2} square2 = {0, -1, 2}输出:{-1,0,2,0}解释:直线 y = 0 能将两个正方形同时分为等面积的两部分,返回的两线段端点为[-1,0]和[2,0]

解题过程及思路:

第一眼看到题目一脸懵,想了五分钟没思路,看了下提示后豁然开朗,这套题基本上是纯粹的数学题,利用高中的知识求解。

由题意得,所求的直线平分两个正方形,而平分正方形的直线一定过正方形的中点,所以题目可以转化为求过两个正方形中点的直线与两个正方形的交点(取最远的两个)。分情况讨论如下:

设中点的坐标分别为:C1(x1, y1),C2(x2, y2),则直线坐标可以表示为:

1、若两正方形中点的X轴坐标相等,则平分线为垂直于X轴的直线(这种情况包含了两中点重合的情况,因为题目要求如果有多条直线满足要求,则选择斜率最大的一条)。

2、若两正方形中点的X轴坐标不相等,则需按直线的斜率考虑:

a. 直线斜率的绝对值大于1时,此时情况如图:

此时交点的Y坐标已知,X坐标未知。

b. 直线斜率的绝对值小于1时,此时情况如图:

此时交点的X坐标已知,Y坐标未知。

c. 直线斜率的绝对值恰好等于1时,可以在上述两种斜率中任选一种即可。

使用python编写代码如下:

代码基本上算纯数学语言转化过来,较为繁琐,仅提供一个思路,可以找找其他大佬的代码,或者用ai生成更简介的代码实现。

def cut_squares(self, square1: List[int], square2: List[int]) -> List[float]: # 先求两个正方形的中心点,因为平分正方形的直线一定过其中心。 square1_center = [float(square1[0]) + float(square1[2]) / 2, float(square1[1]) + float(square1[2] / 2)] square2_center = [float(square2[0]) + float(square2[2]) / 2, float(square2[1]) + float(square2[2] / 2)] # 如果两个正方形X轴坐标相等,则其斜率最大的平分线为垂直与Y轴的直线 if square1_center[0] == square2_center[0]: lower_x = square1_center[0] lower_y = min(square1[1], square2[1]) higher_x = square1_center[0] higher_y = max(square1[1] + square1[2], square2[1] + square2[2]) result = [lower_x, lower_y, higher_x, higher_y] return result # 如果平分线不垂直y轴,则需要求连接两点的直线 k = ((square1_center[1] - square2_center[1]) / (square1_center[0] - square2_center[0])) # 斜率的绝对值大于1时 if k ** 2 >= 1: y1 = min(square1[1], square2[1]) x1 = (y1 - square1_center[1])*(square1_center[0] - square2_center[0])/(square1_center[1] - square2_center[1]) + square1_center[0] y2 = max(square1[1] + square1[2], square2[1] + square2[2]) x2 = (y2 - square1_center[1])*(square1_center[0] - square2_center[0])/(square1_center[1] - square2_center[1]) + square1_center[0] # 需要判断斜率的正负 if k > 0: result = [x1, y1, x2, y2] return result else: result = [x2, y2, x1, y1,] return result #斜率的绝对值小于1时 else: lower_x = min(square1[0], square2[0]) lower_y = (lower_x - square1_center[0])*(square1_center[1] - square2_center[1])/(square1_center[0] - square2_center[0]) + square1_center[1] higher_x = max(square1[0] + square1[2], square2[0] + square2[2]) higher_y = (higher_x - square1_center[0])*(square1_center[1] - square2_center[1])/(square1_center[0] - square2_center[0]) + square1_center[1] result = [lower_x, lower_y, higher_x, higher_y] return result

关注我,从零开始的算法小白之路。

http://www.jsqmd.com/news/1083757/

相关文章:

  • 深入解析 Musl libc 动态链接器启动代码:_dlstart_c 的奥秘
  • 多模态 RAG 技术深度解析:从视觉文档检索到跨模态知识增强的全栈架构与实践
  • Steam Achievement Manager:如何彻底解决成就管理中的三大常见问题
  • 原神帧率解锁神器:轻松突破60FPS限制,畅享丝滑游戏体验
  • 原神帧率解锁终极指南:如何使用genshin-fps-unlock畅享高帧率体验
  • ArkUI(视频/按钮)组件介绍
  • 钢木组合结构自攻螺钉单剪节点试验研究
  • iOS OC 项目集成 C++ 算法库完整指南
  • 一个支持自定义协议模板解析的串口调试工具
  • SpringBoot云边协同|智慧地铁ISCS改造实战第5篇:边缘OPC采集重构|边缘就近网关接入、测点本地降噪预处理、主干带宽减负落地方案
  • 使用Scraper Studio,告别手写爬虫
  • 终极原神帧率解锁指南:如何安全突破60帧限制,畅享144Hz丝滑体验
  • 会议室预订别再靠群里喊:时间冲突检测、审批、签到一套搞定
  • Bioicons:如何为生命科学研究提供专业的免费矢量图标资源?
  • 别急着执行 AI 写的用例,先让它做一次用例评审
  • 三次图中最大分离匹配的优化算法:从匹配割理论到工程实践
  • 免费高效的Blender导入3dm插件:快速打通Rhino到Blender的3D工作流
  • 鹤壁企业采购烟酒,怎么选?
  • 京东购物自动评价神器:3分钟告别手动评价烦恼
  • Chatbox终极指南:如何构建你的本地AI助手桌面应用
  • TranslucentTB:让Windows任务栏焕然一新的终极透明美化方案
  • MSBuild构建流程
  • 计算机毕业设计之jsp基于协同过滤算法的影视作品推荐系统
  • 2026年南山科技与跨境企业GEO服务商参考
  • Unity Mod Manager:5分钟掌握Unity游戏模组管理神器
  • Windows三指拖拽终极指南:轻松实现macOS流畅触控体验
  • Web应用日志安全审计:Session泄露漏洞原理、复现与修复实战
  • 水土流失监测设备:流域水土数据采集
  • 3个维度解密微信聊天记录:从数据迷雾到清晰对话
  • 2026年重庆地区项目交付周期技术解析:以山三云企类项目为例