本文已参与「新人创作礼」活动,一起开启掘金创作之路。
| 每日一题做题记录,参考官方和三叶的题解 |
题目要求
思路:逆向思维
直接顺着思路模拟复杂度太高了,有太多可能性,那不如执果索因,逆着往回减。
因为横纵两个坐标不能相等(相减为),所以只要不断地用大的减去小的就好了。减到有至少一轴小于等于起点值,此时分情况讨论:
- :成立,返回;
- :此时一方已经减到头了,只能对不等的一方继续减,可以把多次减操作简化为模运算,其模运算结果若与目标(起点)相等,也就是到目标之间的差值是另一方的整数倍,即模结果为,则返回,否则返回;
- :减不出来结果,直接。
因为是两方相加得到的结果,所以可以用模运算替代减法提升效率。
Java
class Solution {
public boolean reachingPoints(int sx, int sy, int tx, int ty) {
while(sx < tx && sy < ty) {
if(tx < ty)
ty %= tx;
else
tx %= ty;
}
if(tx < sx || ty < sy)
return false;
return sx == tx ? (ty - sy) % tx == 0 : (tx - sx) % ty == 0;
}
}
- 时间复杂度:
- 空间复杂度:
C++
【……真的不是水,但是它俩一样了……】
class Solution {
public:
bool reachingPoints(int sx, int sy, int tx, int ty) {
while(sx < tx && sy < ty) {
if(tx < ty)
ty %= tx;
else
tx %= ty;
}
if(tx < sx || ty < sy)
return false;
return sx == tx ? (ty - sy) % tx == 0 : (tx - sx) % ty == 0;
}
};
- 时间复杂度:
- 空间复杂度:
总结
一个“困难”的简单题,不被正向的无限可能吓住,理清二者不能相等,然后重复大的一方减去小的一方即可,代码简单到两种语言直接cv。
| 欢迎指正与讨论! |