LC 858. Mirror Reflection
https://leetcode.com/problems/mirror-reflection/
在写之前我特意看了一下题解,真是太畜生了,原来是有数学方法可以解决的。我的方法是比较笨的模拟,但是我觉得还是值得写写的,因为最后写出来其实没有太多的分支判断。
我的思路是这样的:
- 光线先处于起始点(0,0), 然后假设以dx=p, dy=q的速度前进
- 肯定是x或者是y先到达边缘,x的边缘是[0, p], y的边缘是[0, p]
- 如果是x到达边缘的话,那么dx就会变换方向
- 如果是y到达边缘的话,那么dy就会变换方向
class Solution: def mirrorReflection(self, p: int, q: int) -> int: x, y = 0, 0 dx, dy = p, q eps = 1e-6 def near(x, y, a, b): return abs(a - x) < eps and abs(b - y) < eps def eq(x, y): return abs(x - y) < eps ans = -1 while True: if near(x, y, p, 0): ans = 0 break if near(x, y, p, p): ans = 1 break if near(x, y, 0, p): ans = 2 break if dx > 0: tx = (p - x) / dx else: tx = -x / dx if dy > 0: ty = (p - y) / dy else: ty = -y / dy t = min(tx, ty) # x,y某一个先到达边缘 x += dx * t y += dy * t # print('>>>', x, y, dx, dy) # 如果到达边缘,调整行进方向,但是其实速度是不变的 if eq(x, 0) or eq(x, p): dx = -dx if eq(y, 0) or eq(y, p): dy = -dy return ans
UPDATE: https://leetcode.com/problems/mirror-reflection/discuss/146336/Java-solution-with-an-easy-to-understand-explanation 这个解释很棒
First, think about the case p = 3 & q = 2. So, this problem can be transformed into finding m * p = n * q, where m = the number of room extension + 1. n = the number of light reflection + 1. If the number of light reflection is odd (which means n is even), it means the corner is on the left-hand side. The possible corner is 2. Otherwise, the corner is on the right-hand side. The possible corners are 0 and 1. Given the corner is on the right-hand side. If the number of room extension is even (which means m is odd), it means the corner is 1. Otherwise, the corner is 0. So, we can conclude: m is even & n is odd => return 0. m is odd & n is odd => return 1. m is odd & n is even => return 2. Note: The case m is even & n is even is impossible. Because in the equation m * q = n * p, if m and n are even, we can divide both m and n by 2. Then, m or n must be odd. --