1. 题目

给定两个正方形及一个二维平面。请找出将这两个正方形分割成两半的一条直线。
假设正方形顶边和底边与 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]提示:
square.length == 3
square[2] > 0

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bisect-squares-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 过两个正方形中心的直线
  • 分成斜率无穷大(垂直于x轴)、斜率绝对值>=1、< 1 考虑
  • 交点在上下边,还是在左右边
class Solution {public:vector<double> cutSquares(vector<int>& square1, vector<int>& square2) {if(square1[1] > square2[1])swap(square1,square2);//第一个的左下角y坐标更小double cx1, cy1, cx2, cy2, r1, r2;r1 = square1[2]/2.0;r2 = square2[2]/2.0;cx1 = square1[0]+r1;//中心坐标cy1 = square1[1]+r1;cx2 = square2[0]+r2;cy2 = square2[1]+r2;if(cx1==cx2)//斜率无穷大return {cx1,cy1-r1,cx1,max(cy1+r1,cy2+r2)};else//斜率存在,分两种情况,与上下边相交,左右边相交{double k = (cy1-cy2)/(cx1-cx2);double b = cy1-k*cx1;vector<vector<double>> points;if(abs(k)>=1)//交点在上下边{points.push_back({(cy1+r1-b)/k, cy1+r1});points.push_back({(cy1-r1-b)/k, cy1-r1});points.push_back({(cy2+r2-b)/k, cy2+r2});points.push_back({(cy2-r2-b)/k, cy2-r2});sort(points.begin(),points.end());return {points.front()[0],points.front()[1],points.back()[0],points.back()[1]};}else//交点在左右边{points.push_back({cx1+r1, k*(cx1+r1)+b});points.push_back({cx1-r1, k*(cx1-r1)+b});points.push_back({cx2+r2, k*(cx2+r2)+b});points.push_back({cx2-r2, k*(cx2-r2)+b});sort(points.begin(),points.end());return {points.front()[0],points.front()[1],points.back()[0],points.back()[1]};}}}
};

4 ms 8.6 MB

程序员面试金典 - 面试题 16.13. 平分正方形(数学)相关推荐

  1. 程序员面试金典 - 面试题 16.03. 交点(数学)

    1. 题目 给定两条线段(表示为起点start = {X1, Y1}和终点end = {X2, Y2}),如果它们有交点,请计算其交点,没有交点则返回空值. 要求浮点型误差不超过10^-6.若有多个交 ...

  2. 程序员面试金典 - 面试题 08.13. 堆箱子(DP)

    1. 题目 堆箱子.给你一堆n个箱子,箱子宽 wi.深 di.高 hi. 箱子不能翻转,将箱子堆起来时,下面箱子的宽度.高度和深度必须大于上面的箱子. 实现一种方法,搭出最高的一堆箱子.箱堆的高度为每 ...

  3. [Leetcode][程序员面试金典][面试题16.11][JAVA][跳水板][数学][动态规划]

    [问题描述][简单] [解答思路] 边界问题 k=0 ,不能产生跳水板,返回空数组 shorter 等于longer,只有一种跳水板,返回longerk 思路 一般情况,k块木板,k种可能 跳水板的长 ...

  4. java兰顿蚂蚁解题思路_程序员面试金典 - 面试题 16.22. 兰顿蚂蚁(deque模拟)

    1. 题目 一只蚂蚁坐在由白色和黑色方格构成的无限网格上. 开始时,网格全白,蚂蚁面向右侧. 每行走一步,蚂蚁执行以下操作. (1) 如果在白色方格上,则翻转方格的颜色,向右(顺时针)转 90 度,并 ...

  5. 程序员面试金典 - 面试题 16.22. 兰顿蚂蚁(deque模拟)

    1. 题目 一只蚂蚁坐在由白色和黑色方格构成的无限网格上. 开始时,网格全白,蚂蚁面向右侧. 每行走一步,蚂蚁执行以下操作. (1) 如果在白色方格上,则翻转方格的颜色,向右(顺时针)转 90 度,并 ...

  6. 程序员面试金典 - 面试题 16.09. 运算(只用+法做乘除)

    1. 题目 请实现整数数字的乘法.减法和除法运算,运算结果均为整数数字, 程序中只允许使用加法运算符和逻辑运算符,允许程序中出现正负常数,不允许使用位运算. 你的实现应该支持如下操作: Operati ...

  7. 程序员面试金典 - 面试题 16.16. 部分排序(排序/不排序)

    文章目录 1. 题目 2. 解题 2.1 排序 2.2 不排序 1. 题目 给定一个整数数组,编写一个函数,找出索引 m 和 n ,只要将索引区间 [m,n] 的元素排好序,整个数组就是有序的. 注意 ...

  8. [Leetcode][程序员面试金典][面试题17.13][JAVA][恢复空格][动态规划][Trie][字符串哈希]

    [问题描述][中等] [解答思路] 1. 动态规划 动态规划流程 第 1 步:设计状态 dp[i] 表示字符串的前 i 个字符的最少未匹配数. 第 2 步:状态转移方程 假设当前我们已经考虑完了前 i ...

  9. 程序员面试金典 - 面试题 16.18. 模式匹配(逻辑题)

    1. 题目 你有两个字符串,即pattern和value. pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式. 例如,字符串"ca ...

最新文章

  1. spring mvc返回页面显示空白_Spring 框架基础(06):Mvc架构模式简介,执行流程详解...
  2. 政府数据集中异地备份概述
  3. Soft NMS论文笔记
  4. 排序算法专题-希尔排序
  5. 质控工具之TrimGalore使用方法
  6. Android 10上的F2FS文件系统制作
  7. python爬虫小项目价格_爬虫项目怎么收费?
  8. 计算机和信息系统安全保密管理规定,信息系统安全和保密管理制度
  9. Excel数字小写金额转换汉字大写金额公式的简单设置
  10. python34 pandas_python 3 科学计算之pandas入门(一)
  11. HDU 1849 Rabbit and Grass
  12. 如何系统地学习计算机编程?自学还是培训?怎么选?
  13. Unity基础篇:Serializable总结与深入研究。
  14. ssm中报错: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type a
  15. 编译原理——词法分析(1)
  16. Python高效实现滑块验证码自动操纵
  17. 概率论与数理统计笔记第一天
  18. 计算机毕业设计(附源码)python学生宿舍管理系统
  19. 原滴滴AI Labs负责人叶杰平加入贝壳找房,出任首席科学家
  20. 区块链职业技术技能标准的出台,对区块链人才培养具有指导意义

热门文章

  1. mac 编译android系统,mac 编译 Android 系统杂记
  2. DataReceivedEventHandler 委托 接收调用执行进程返回数据
  3. Linux进程全解3——进程概念、进程ID、多进程调度原理
  4. mysql 文件系统规划_Mysql的文件系统规划以及日志配置
  5. windows下修改tomcat的startup.bat脚本文件后台运行
  6. python 编程模型
  7. LeetCode:二进制手表【401】
  8. Java程序员应该了解的10个设计原则
  9. (机器学习/计算机视觉/深度学习)代码
  10. Linux 系统下载网址