题目地址:

https://leetcode.com/problems/reaching-points/

给定一个数对(x,y)(x,y)(x,y),每走一步可以到达(x+y,y)(x+y,y)(x+y,y)或者(x,x+y)(x,x+y)(x,x+y),再给定一个目标数对,问从初始数对出发能否走到目标数对。题目保证xxx和yyy都是正整数。

如果start和target相等,那直接返回true。否则对于某个(x,y)(x,y)(x,y),一定有x≠yx \ne yx​=y,因为要到达(x,x)(x,x)(x,x),其上一步必然是(0,x)(0,x)(0,x)或者(x,0)(x,0)(x,0),与xxx是正数矛盾。而若x>yx>yx>y,则上一步一定是(x−y,y)(x-y,y)(x−y,y),否则上一步一定是(x,y−x)(x, y-x)(x,y−x)。如此逆推回去,看看能不能推到start即可。
注意到这里可以进行一点优化。如果当x>yx>yx>y,我们需要验证(x−y,y),(x−2y,y)...,(x−ky,y)(x-y,y),(x-2y,y)...,(x-ky,y)(x−y,y),(x−2y,y)...,(x−ky,y)(其中x−(k−1)y>yx-(k-1)y>yx−(k−1)y>y但x−ky<yx-ky<yx−ky<y)是否等于start,我们也可以这么做:求(tx%ty,ty)(tx\%ty, ty)(tx%ty,ty),然后判断sy == ty(sx - tx % ty) % ty == 0,这两者的等价性非常显然。优化后的代码如下:

public class Solution {public boolean reachingPoints(int sx, int sy, int tx, int ty) {if (sx == tx && sy == ty) {return true;}while (sx <= tx && sy <= ty) {if (tx > ty) {tx %= ty;} else {ty %= tx;}if (sx == tx && (sy - ty) % sx == 0) {return true;}if (sy == ty && (sx - tx) % sy == 0) {return true;}}// 如果跳出循环了,说明sx > tx或者sy > ty,这就不可能再达到了,返回falsereturn false;}
}

时间复杂度O(log⁡min⁡(tx,ty))O(\log \min(tx,ty))O(logmin(tx,ty)),空间O(1)O(1)O(1)。

时间复杂度证明:
很显然求(tx,ty)(tx,ty)(tx,ty)的最大公约数的步数可以作为时间复杂度的一个上界。先证明,如果求aaa和bbb的最大公约数的步数为nnn,且a>b>0a>b>0a>b>0,则最小的aaa和bbb分别是Fn+2F_{n+2}Fn+2​和Fn+1F_{n+1}Fn+1​(这里的意思是,需要步数为nnn的所有数对里,bbb最小是Fn+1F_{n+1}Fn+1​,然后对于这个bbb,aaa最小可以取Fn+2F_{n+2}Fn+2​),其中FnF_nFn​为斐波那契数,F1=F2=1F_1=F_2=1F1​=F2​=1,Fn=Fn−1+Fn−2F_n=F_{n-1}+F_{n-2}Fn​=Fn−1​+Fn−2​。数学归纳法,如果只需要一步,此时余数为000,所以a=2=F3a=2=F_3a=2=F3​,b=1=F2b=1=F_2b=1=F2​,成立。假设对需要kkk步的时候也成立,当需要k+1k+1k+1步的时候,第一步为a=bq0+r0a=bq_0+r_0a=bq0​+r0​,第二步为b=r0q1+r1b=r_0q_1+r_1b=r0​q1​+r1​,所以bbb最小是Fk+2F_{k+2}Fk+2​,r0r_0r0​最小是Fk+1F_{k+1}Fk+1​,而最小的aaa在q0=1q_0=1q0​=1时取到,所以aaa最小是Fk+3F_{k+3}Fk+3​。

由上可知,而斐波那契数FnF_nFn​与nnn的关系是个对数的关系,所以时间复杂度为O(log⁡min⁡(tx,ty))O(\log \min(tx,ty))O(logmin(tx,ty))。

【Leetcode】780. Reaching Points相关推荐

  1. 【leetcode】963. Minimum Area Rectangle II

    题目如下: Given a set of points in the xy-plane, determine the minimum area of any rectangle formed from ...

  2. 【LeetCode】﹝数学规律ி﹞第N位数字、可怜的小猪

    [LeetCode]﹝数学规律ி﹞第N位数字.可怜的小猪 文章目录 [LeetCode]﹝数学规律ி﹞第N位数字.可怜的小猪 乐团站位★ 罗马数字转整数★ 整数转罗马数字★★ 第 N 位数字★★ 数字 ...

  3. 【Leetcode】100. 相同的树

    题目 给定两个二叉树,编写一个函数来检验它们是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. 示例 1: 输入: 1 1/ \ / \2 3 2 3[1,2,3], [1 ...

  4. 【leetcode】85. Maximal Rectangle 0/1矩阵的最大全1子矩阵

    1. 题目 Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1 ...

  5. 【leetcode】486. Predict the Winner

    题目如下: Given an array of scores that are non-negative integers. Player 1 picks one of the numbers fro ...

  6. 【leetcode】132. Palindrome Partitioning II

    题目如下: 解题思路:本题是[leetcode]131. Palindrome Partitioning的升级版,要求的是求出最小cuts,如果用[leetcode]131. Palindrome P ...

  7. 【leetcode】86. Partition List

    题目如下: Given a linked list and a value x, partition it such that all nodes less than x come before no ...

  8. 【Leetcode】103. 二叉树的锯齿形层次遍历

    题目 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 ...

  9. 【Leetcode】79.单词搜索

    题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格 ...

  10. 【leetcode】 算法题1 两数之和

    [leetcode] 算法题1 两数之和 问题   给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums ...

最新文章

  1. Hadoop.2.x_HA部署
  2. [0618]Tyvj1128中文大写数字
  3. ASUS华硕笔记本电脑的数字小键盘按什么健切换?
  4. 23. Leetcode 24. 两两交换链表中的节点 (链表-基础操作类-交换链表)
  5. uploadify多文件上传插件
  6. matlab获得帮助的途径,在MATLAB 中获得帮助的途径 ()。A、帮助浏览器B、help 命令C、lookfor 命令D、模糊查询...
  7. linux用u盘上传文件,linux如何挂载U盘和文件系统(或需要用到).doc
  8. php增删改查怎么封装,php增删改查封装方法
  9. Json转化的三种方式
  10. c ++中哈希表如何访问_C / C ++中的哈希表–完整的实现
  11. RecyclerView Widget 使用
  12. 知其然知其所以然 itoa实现 整型转字符串
  13. AutoCAD2020安装教程
  14. mp3转为pcm工具
  15. 4根网线水晶头接法(8根只接4根即可通讯)
  16. 输入一个小写,输出大写字母
  17. hyper-v 网桥_使用网桥简化网络-使FIO ActionTec MI424-WR成为网桥
  18. 进化论VS中性突变理论
  19. 10 竞争神经网络与SOM神经网络matlab参考程序
  20. python canopen_CAN与CANOPEN在电机控制中的应用

热门文章

  1. SpringCloud升级之路2020.0.x版-42.SpringCloudGateway 现有的可供分析的请求日志以及缺陷
  2. closest()方法简介
  3. 微波放大器和混频器的测试
  4. 最新!2016中国城市GDP排名出炉
  5. r如何打开计算机窗口,如何进入运行窗口
  6. 关于以太网没有有效的ip配置问题解决方法
  7. Tracking相关的文章
  8. jquery中addClass()和removeClass()方法
  9. 数据结构 创建结构体学生表 c语言
  10. 面向问题编程-切面+反射实现字段级别权限控制