Java&C++题解与拓展——leetcode780.到达终点【没啥新知识】

132 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

每日一题做题记录,参考官方和三叶的题解

题目要求

在这里插入图片描述

思路:逆向思维

直接顺着思路模拟复杂度太高了,有太多可能性,那不如执果索因,逆着往回减。
因为横纵两个坐标不能相等(相减为00),所以只要不断地用大的减去小的就好了。减到有至少一轴小于等于起点值,此时分情况讨论:

  • (tx=sx)&&(ty=sy)(tx=sx) \&\& (ty=sy):成立,返回truetrue
  • (tx=sx)(ty=sy)(tx=sx) ||( ty=sy):此时一方已经减到头了,只能对不等的一方继续减,可以把多次减操作简化为模运算,其模运算结果若与目标(起点)相等,也就是到目标之间的差值是另一方的整数倍,即模结果为00,则返回truetrue,否则返回falsefalse
  • (tx!=sx)&&(ty!=sy)(tx!=sx) \&\&(ty!=sy):减不出来结果,直接falsefalse

因为是两方相加得到的结果,所以可以用模运算替代减法提升效率。

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;
    }
}
  • 时间复杂度:O(log(max(tx,ty)))O(\log (\max (tx, ty)))
  • 空间复杂度:O(1)O(1)

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;
    }
};
  • 时间复杂度:O(log(max(tx,ty)))O(\log (\max (tx, ty)))
  • 空间复杂度:O(1)O(1)

总结

一个“困难”的简单题,不被正向的无限可能吓住,理清二者不能相等,然后重复大的一方减去小的一方即可,代码简单到两种语言直接cv。


欢迎指正与讨论!