LeetCode算法题-镜面反射(Mirror Reflection)
1. 题目:
有一个四面墙都有镜子的特殊正方形房间。除了西南角之外,其他三个角都有接收器,编号为0, 1, 2。方形房间的墙长度为p,有一束射线从西南角照射到东面的墙上,到墙角0的距离为q。请找出射线遇到的第一个接收器的编号(可以保证射线最终会遇到一个接收器)。
例如:
输入:p = 2, q = 1
输出:2
解释:当射线第一次反射到左边墙上的时候,会遇到接收器2。
注意:
1. 1 <= p <= 1000
2. 0 <= q <= p
2. 解释:
这道题如果直接硬解会比较复杂,可以用多次空间想象降低复杂度。
第一步:将射线照射方向直线延长,按照横向和纵向展开方形房间,如下图:
将射线直线延长后,遇到第一个接收器时,可以得到边长x,y的三角形,该三角形是通过边长p,q的三角形延长得到的,所以x/p = y/q,因为x/p为整数,所以y/q也为整数,又因为y同时也是方形边长p的整数倍,所以设存在整数变量n,y=np,找出最小值n满足np是q的整数倍即可,即可得到公式:
n = 1; while( p*n % q != 0) n += 1 ;
通过上面的公式可以得出满足q和p最小公倍数y的变量n,y=np, x=(np/q)* p, 记住n、x和y的值对后面的推导很关键。
第二步:只在横向方向展开方形房间,射线会发生反射,如下图:
将方形房间按照横向展开,射线只在横轴发生发射,接收器0在下方,接收器1和2在上方,当射线反射2次、4次、6次、8次等2的倍数次才能遇到在下方的接收器0,那么反射的次数乘以方形边长p即等于第一步纵向展开的y,又因为第一步已经推导出了y=np,所以n即为反射的次数,当n为偶数时,射线会遇到接收器0,可得到公式:
if( n % 2 ==0 ) return 0;
第三步:还是只在横向方向展开方向房间,如下图:
当射线遇到接收器1时,横向距离x为X1,观察图可知X1是方形边长p的奇数倍,当射线遇到接收器2时,横向距离x为X2,观察图可知X2为方形边长p的偶数倍,第一步中已得到x=(np/q)* p,那么x的方形边长p的倍数为:(np/q)* p / p = np/q,可得到公式:
int r = p*n /q; if(r % 2 ==0) return 2; if(r % 2 ==1) return 1;
3. 总结:
该题考察的是对空间想象的能力,通过上面三步对方形房间的空间展开,很大程度降低了解题难度,综合每步得到的公式,汇总可以得到该题的正确答案:
public int mirrorReflection(int p, int q) {int n = 1;while( p*n % q != 0) n += 1 ;if( n % 2 ==0 ) return 0;int r = p*n /q;if(r % 2 ==0) return 2;if(r % 2 ==1) return 1;return -1;
}
LeetCode算法题-镜面反射(Mirror Reflection)相关推荐
- LeetCode算法题-Nth Digit(Java实现)
这是悦乐书的第215次更新,第228篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第83题(顺位题号是400).找到无限整数序列的第n个数字1,2,3,4,5,6,7,8 ...
- LeetCode算法题-Reverse Linked List(Java实现)
这是悦乐书的第192次更新,第195篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第51题(顺位题号是206).反转单链表.例如: 输入:1-> 2-> 3- ...
- LeetCode算法题-Convert a Number to Hexadecimal(Java实现)
这是悦乐书的第219次更新,第231篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第86题(顺位题号是405).给定一个整数,写一个算法将其转换为十六进制.对于负整数,使 ...
- leetcode算法题--零钱兑换
原题链接:https://leetcode-cn.com/problems/coin-change/ 相关题目:leetcode算法题–完全平方数★ 动态规划 dp[i] i从0到amount,dp[ ...
- leetcode算法题-- 买卖股票的最佳时机
原题链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/ 这类股票题目请见leetcode算法题–最佳买卖股票时机含 ...
- leetcode算法题--买卖股票的最佳时机 II
原题链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/ 这类股票题目请见leetcode算法题–最佳买卖股票 ...
- leetcode算法题--买卖股票的最佳时机含手续费
原题链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/ 这类股票题目请见 ...
- leetcode算法题--完全平方数★
原题链接:https://leetcode-cn.com/problems/perfect-squares/ 相关题目:leetcode算法题–零钱兑换 1.回溯法 就是暴力法,套路就是递归,但是有很 ...
- leetcode算法题--不同的二叉搜索树
原题链接:https://leetcode-cn.com/problems/unique-binary-search-trees/ 相关题目:leetcode算法题--不同的二叉搜索树 II 1.递归 ...
最新文章
- 对比两个同类型的泛型集合并返回差异泛型集合 ——两个List类名的比较
- Foundations of Qt Development 学习笔记 Part1 Tips1-50
- php 表单搜索,wordpress的搜索表单searchform.php
- linux制作openssl rpm,CentOS 7 定制 OpenSSL RPM 包
- infoseccrypto_java下载_關於php接ICBC的支付接口的解決方案
- 从零开始入门 K8s | K8s 安全之访问控制
- php json 压缩传输,php json数据使用gzip压缩输出
- GitRepo 命令大全 ***
- 关于Apache2.4版本的phpMyAdmin的配置
- 别忽视分布式系统这六大“暗流”
- windows环境中JDK环境变量配置
- java lombok ppt,Lombok详解
- 台达plc自由口通讯_自由口通讯问题无法接收数据
- AMTEmu v0.9.2
- QT5修改windows电脑IP地址
- FastDFS 原理介绍
- tampermonkey这玩意如何替换flash播放器为h5播放器?
- Windows XP 按权限设置共享
- cmd检查java_如何通过cmd查看java环境
- Elasticsearch-2-附面试题
热门文章
- 【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
- 详解Po.et 技术栈
- 华为软开云7--部署
- Σoφoς:简单但有效的前向安全对称可搜索加密
- MySQL 5.6.21下载安装之安装篇(二)
- 软件测试qq是不是微信号,如何批量检测出QQ号是否开通微信?
- Glyphs for Mac 2.6.5 — 字体设计工具
- 微信自定义链接分享制作,微信自定义链接配置
- python外文文献翻译_英文学术文献翻译软件有哪些推荐?
- macbook新建html文件,New File Creation: 给 Mac 加上“新建文件菜单”