【刷题日记】780. 到达终点

简介: 本次刷题日记的第 28 篇,力扣题为:429. N 叉树的层序遍历 ,困难

【刷题日记】780. 到达终点

本次刷题日记的第 28 篇,力扣题为:429. N 叉树的层序遍历困难

一、题目描述:

image.png

周六咱们早点来刷每日一题,今天是一个困难题,题目的内容比较少也比较明确,做起来应该不难


那么我们就开始仔细分析一下吧

二、这道题考察了什么思想?你的思路是什么?

查看这道题目,重点信息如下:

  • 题目给出 2 个坐标,我们可以通过坐标 1 根据题目中给出的逻辑,转化成 坐标 2 ,如果可以,那么结果就是 true,反之就是 false
  • 那么题目中的意思,我们是不是也可以通过坐标 2 按照逻辑,转换成坐标 1 也是可以实现的嘞
  • 转换的时候,我们需要注意,(x,y) ,开始转换的时候,只能转换成 (x+y,y) 或者 (x,y+x) , 而不能是 (x+x,y) ,或者 (x,y+y) ,或者 (x+x,y+y)

那么我们就来推演一下这个题要如何去实现吧

题目给出的示例是:sx = 1, sy = 1, tx = 3, ty = 5

sx = sx  = 1 , sy = sx+sy = 2

sx = sx + sy = 3 , sy = sy = 2

sx = sx = 3, sy = sy + sx = 5

对于这种数字比较小的时候,咱们还比较好推演,当数字大的时候,我们到底是在 sx 上加上 sy ,还是在 sy 上 加上 sx

我们只能对于每一种情况不停的向下加,直到所有路径中,有 1 种路径是可以转换成 tx ,ty 的,那么就是可以的实现的

那么,上述的这种方式,情况实在是太多,当数据量大的时候,就会出现超时的情况,是不符合题目给出的要求的,对于题目给给出的测试用例,是不能完全跑过的

那么,我们也可以将 tx, ty 转成 sx, sy 来看看效果

tx , ty 转成 sx 和 sy 的时候,按照上述逻辑就是 (tx-ty,ty) 或者 (tx,ty -tx)

那么此处就要注意,对于这里的减法,那么肯定是 大数减去小数,才能得到我们期望的正数

开始推演:

tx = 3 , ty = 5

tx = 3, ty = ty -tx = 2

tx = tx - ty = 1 , ty = 2

tx = 1, ty = ty - tx = 1

此时,咱们反推,也是 OK 的,但是我们发现,发推的话,逻辑就比较明确,也没有那么多弯弯绕绕,只需要比较 tx ,ty 谁大,大的减去对方就可以了

但是这里还需要注意的是,只要当我们 tx 或者 ty 减到其中 tx = sx 或者 ty = sy 的时候,那么就不能再减下去了

此时,我们就可以查看 当前的较大的一个数 减去 对应的sx 或者 sy,是对方的倍数,

例如,我们此时不能再往下减了,此时 tx 已经等于 sx,那么我们就可以校验 ty - sy 的结果是否是 tx 的整数倍即可,因为这个时候,只能是 ty 不断的减去 tx 来看是否有机会等于 sy

image.png

那这个时候,我们又发现,这其实是一个数学题,我们理清楚思路之后,就可以来编码了,思路如下:

  • 咱们使用反向推导,让 tx, ty  减去对方,来查看是否可以转换成 sx, sy

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码,此处需要注意,当tx = sx, 或者 ty = sy 的时候,咱们就不能再减下去了,这个时候,就需要校验上述说到的逻辑了

image.png

编码如下:

func reachingPoints(sx, sy, tx, ty int) bool {
    // 辗转相除,直到 tx <= sx  或者 ty <= sy
    for tx > sx && ty > sy  {
        if tx > ty {
            tx %= ty
        } else {
            ty %= tx
        }
    }
    // 退出上述条件之后,开始校验 tx,ty 中较大的一个数字是否是否可以被另外一个数字整除
    switch {
    case tx == sx && ty == sy:
        return true
    case tx == sx:
        return ty > sy && (ty-sy)%tx == 0
    case ty == sy:
        return tx > sx && (tx-sx)%ty == 0
    default:
        return false
    }
}

看了上述编码后,逻辑还是非常清晰的吧,xdm 有时间也可以自己推理一下,反着推理确实比正向推理要明确的多

四、总结:

那么本次的空复杂度是 O(1),这个不难看出,因为我们都没有引入新的空间,那时间复杂度是多少呢,我们可以思考一下,咱本次的时间复杂度,依赖于上述的 for 循环,可是循环的次数是多少呢?

咱们的时间复杂度是 O(n)  , O(log tx) , O(log ty)  还是 O(log max(tx + ty)) 呢?

原题地址:780. 到达终点

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~


相关文章
|
11月前
|
存储
atoi函数解析以及自定义类型经典练习题
atoi函数解析以及自定义类型经典练习题
179 0
|
安全 Linux 网络安全
【Windows】搭建Emby媒体库服务器,实现无公网IP远程访问
【Windows】搭建Emby媒体库服务器,实现无公网IP远程访问
1019 0
|
机器学习/深度学习 计算机视觉
YOLOv5改进 | 2023 | InnerIoU、InnerSIoU、InnerWIoU、FocusIoU等损失函数
YOLOv5改进 | 2023 | InnerIoU、InnerSIoU、InnerWIoU、FocusIoU等损失函数
556 0
|
域名解析 弹性计算 Linux
阿里云——网站建设:部署与发布(知识点)
阿里云——网站建设:部署与发布(知识点)
517 0
|
小程序 JavaScript Java
人事|人事管理系统|基于Springboot的人事管理系统设计与实现(源码+数据库+文档)
人事|人事管理系统|基于Springboot的人事管理系统设计与实现(源码+数据库+文档)
321 1
|
存储 并行计算 NoSQL
如何利用Java进行大数据处理?
如何利用Java进行大数据处理?
基于PID-bang-bang控制算法的卫星姿态控制matlab仿真
该文主要介绍了一个基于PID-bang-bang控制算法的卫星姿态控制系统。在MATLAB2022a中进行了仿真,生成了控制收敛曲线和姿态调整动画。系统通过PID控制器减少误差,结合Bang-Bang控制实现快速响应。核心程序涉及卫星位置、推力向量的计算及动画绘制。PID控制器利用比例、积分、微分项调整输出,Bang-Bang控制则在误差超出阈值时提供即时修正。两者结合以平衡控制精度和响应速度,适应卫星姿态的精确调节需求。
|
JavaScript Java 测试技术
基于小程序的个人健康数据管理系统+springboot+vue.js附带文章和源代码设计说明文档ppt
基于小程序的个人健康数据管理系统+springboot+vue.js附带文章和源代码设计说明文档ppt
184 0
|
缓存 JavaScript 开发工具
|
安全 网络协议 物联网
配置Hotspot2.0无线网络示例
某网络服务商在原有移动网络业务的基础上,新增部署WLAN网络接入业务,为用户提供更好的网络体验。但传统的WLAN网络业务需要用户手动选择SSID,手动接入网络并设置认证信息,用户体验较差。为了提升用户体验,部署Hotspot2.0业务,使用SIM作为用户的身份凭证,让用户无感知的自动接入正确的网络。
223 4