程序员面试金典 - 面试题 16.13. 平分正方形(数学)
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. 平分正方形(数学)相关推荐
- 程序员面试金典 - 面试题 16.03. 交点(数学)
1. 题目 给定两条线段(表示为起点start = {X1, Y1}和终点end = {X2, Y2}),如果它们有交点,请计算其交点,没有交点则返回空值. 要求浮点型误差不超过10^-6.若有多个交 ...
- 程序员面试金典 - 面试题 08.13. 堆箱子(DP)
1. 题目 堆箱子.给你一堆n个箱子,箱子宽 wi.深 di.高 hi. 箱子不能翻转,将箱子堆起来时,下面箱子的宽度.高度和深度必须大于上面的箱子. 实现一种方法,搭出最高的一堆箱子.箱堆的高度为每 ...
- [Leetcode][程序员面试金典][面试题16.11][JAVA][跳水板][数学][动态规划]
[问题描述][简单] [解答思路] 边界问题 k=0 ,不能产生跳水板,返回空数组 shorter 等于longer,只有一种跳水板,返回longerk 思路 一般情况,k块木板,k种可能 跳水板的长 ...
- java兰顿蚂蚁解题思路_程序员面试金典 - 面试题 16.22. 兰顿蚂蚁(deque模拟)
1. 题目 一只蚂蚁坐在由白色和黑色方格构成的无限网格上. 开始时,网格全白,蚂蚁面向右侧. 每行走一步,蚂蚁执行以下操作. (1) 如果在白色方格上,则翻转方格的颜色,向右(顺时针)转 90 度,并 ...
- 程序员面试金典 - 面试题 16.22. 兰顿蚂蚁(deque模拟)
1. 题目 一只蚂蚁坐在由白色和黑色方格构成的无限网格上. 开始时,网格全白,蚂蚁面向右侧. 每行走一步,蚂蚁执行以下操作. (1) 如果在白色方格上,则翻转方格的颜色,向右(顺时针)转 90 度,并 ...
- 程序员面试金典 - 面试题 16.09. 运算(只用+法做乘除)
1. 题目 请实现整数数字的乘法.减法和除法运算,运算结果均为整数数字, 程序中只允许使用加法运算符和逻辑运算符,允许程序中出现正负常数,不允许使用位运算. 你的实现应该支持如下操作: Operati ...
- 程序员面试金典 - 面试题 16.16. 部分排序(排序/不排序)
文章目录 1. 题目 2. 解题 2.1 排序 2.2 不排序 1. 题目 给定一个整数数组,编写一个函数,找出索引 m 和 n ,只要将索引区间 [m,n] 的元素排好序,整个数组就是有序的. 注意 ...
- [Leetcode][程序员面试金典][面试题17.13][JAVA][恢复空格][动态规划][Trie][字符串哈希]
[问题描述][中等] [解答思路] 1. 动态规划 动态规划流程 第 1 步:设计状态 dp[i] 表示字符串的前 i 个字符的最少未匹配数. 第 2 步:状态转移方程 假设当前我们已经考虑完了前 i ...
- 程序员面试金典 - 面试题 16.18. 模式匹配(逻辑题)
1. 题目 你有两个字符串,即pattern和value. pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式. 例如,字符串"ca ...
最新文章
- spring mvc返回页面显示空白_Spring 框架基础(06):Mvc架构模式简介,执行流程详解...
- 政府数据集中异地备份概述
- Soft NMS论文笔记
- 排序算法专题-希尔排序
- 质控工具之TrimGalore使用方法
- Android 10上的F2FS文件系统制作
- python爬虫小项目价格_爬虫项目怎么收费?
- 计算机和信息系统安全保密管理规定,信息系统安全和保密管理制度
- Excel数字小写金额转换汉字大写金额公式的简单设置
- python34 pandas_python 3 科学计算之pandas入门(一)
- HDU 1849 Rabbit and Grass
- 如何系统地学习计算机编程?自学还是培训?怎么选?
- Unity基础篇:Serializable总结与深入研究。
- ssm中报错: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type a
- 编译原理——词法分析(1)
- Python高效实现滑块验证码自动操纵
- 概率论与数理统计笔记第一天
- 计算机毕业设计(附源码)python学生宿舍管理系统
- 原滴滴AI Labs负责人叶杰平加入贝壳找房,出任首席科学家
- 区块链职业技术技能标准的出台,对区块链人才培养具有指导意义