lintcode 1036 · 可达点【数学 hard】

题目链接,描述

https://www.lintcode.com/problem/1036

一次移动是指把(x, y)移动到(x, x + y)(x + y, y).
给定起点(sx, sy)、目标点(tx, ty),当且仅当存在一系列移动,使得从起点开始,能到达终点,则返回True,否则返回False.

sx, sy, tx, ty 是正整数且值域为 [1, 10^9].

样例
样例 1:

输入: sx = 1, sy = 1, tx = 3, ty = 5
输出: True
解释:
存在一个从起点到终点的序列是:
(1, 1) -> (1, 2)
(1, 2) -> (3, 2)
(3, 2) -> (3, 5)
样例 2:

输入: sx = 1, sy = 1, tx = 2, ty = 2
输出: False
样例 3:

输入: sx = 1, sy = 1, tx = 1, ty = 1
输出: True

思路

//反向计算
    /*
    如果从sx,sy开始正向计算,则可能的情况非常多,容易超过时间限制。注意到sx,sy,tx,ty都是正整数,因此
    对于给定状态的tx,ty,只有当tx!=ty时才存在上一个状态,且上一个状态唯一。可能情况如下:
    1、如果tx==ty,不存在上一个状态,状态tx,ty即为起点状态
    2、如果tx>ty,则上一个状态是 tx-ty,ty
    3、如果ty>tx,则上一个状态该是tx,ty-tx
    因此可以从tx,ty开始反向计算,判断是否可以到达状态sx,sy,当tx>sx,ty>sy,tx!=ty三个条件同时成立,
    执行反向操作。每一步都是更新tx,ty的值,知道反向操作条件不成立

    由于每一步反向操作都是一定将tx和ty中较大的值减少,因此当tx>ty时可以将tx更新为tx%ty,
    当ty>tx时,可以直接将ty更新为ty%tx;
    当反向操作的条件不成立时,更具tx和ty的不同情况来分别判断是否从起点到达终点
    1、如果tx==sx && ty==sy,则已经达到起点状态,因此可以从起点到终点
    2、如果tx==sx&& ty!=sy,则tx不能继续减少,只能减少ty,因此只有当ty>sy && (ty-sy)%tx ==0 时可以从起点到终点
    3、如果ty==sy&& tx!=sx,则ty不能继续减少,只能减少tx,因为只有当tx>sx&&(tx-sx)%ty==0时可以从起点到达终点
    4、如果tx!=sx&& ty!=sy,则不能从起点到达终点
     */

代码

public class Solution {
    /**
     * @param sx: x for starting point
     * @param sy: y for starting point
     * @param tx: x for target point 
     * @param ty: y for target point
     * @return: if a sequence of moves exists to transform the point (sx, sy) to (tx, ty)
     */
    public boolean reachingPoints(int sx, int sy, int tx, int ty) {
          //反向计算
        /*
        如果从sx,sy开始正向计算,则可能的情况非常多,容易超过时间限制。注意到sx,sy,tx,ty都是正整数,因此
        对于给定状态的tx,ty,只有当tx!=ty时才存在上一个状态,且上一个状态唯一。可能情况如下:
        1、如果tx==ty,不存在上一个状态,状态tx,ty即为起点状态
        2、如果tx>ty,则上一个状态是 tx-ty,ty
        3、如果ty>tx,则上一个状态该是tx,ty-tx
        因此可以从tx,ty开始反向计算,判断是否可以到达状态sx,sy,当tx>sx,ty>sy,tx!=ty三个条件同时成立,
        执行反向操作。每一步都是更新tx,ty的值,知道反向操作条件不成立

        由于每一步反向操作都是一定将tx和ty中较大的值减少,因此当tx>ty时可以将tx更新为tx%ty,
        当ty>tx时,可以直接将ty更新为ty%tx;
        当反向操作的条件不成立时,更具tx和ty的不同情况来分别判断是否从起点到达终点
        1、如果tx==sx && ty==sy,则已经达到起点状态,因此可以从起点到终点
        2、如果tx==sx&& ty!=sy,则tx不能继续减少,只能减少ty,因此只有当ty>sy && (ty-sy)%tx ==0 时可以从起点到终点
        3、如果ty==sy&& tx!=sx,则ty不能继续减少,只能减少tx,因为只有当tx>sx&&(tx-sx)%ty==0时可以从起点到达终点
        4、如果tx!=sx&& ty!=sy,则不能从起点到达终点
         */
      while (tx > sx && ty>sy){
          if(tx>ty){
              tx =tx%ty;
          }else{
              ty=ty%tx;
          }
      }

      if(tx ==sx  && ty==sy){
          return true;
      }else if(tx==sx){
          return ty>sy &&(ty-sy)%tx==0;
      }else if(ty ==sy){
          return tx>sx && (tx-sx)%ty ==0;
      }else{
          return false;
      }
    }
}

你可能感兴趣的:(算法,java,数据结构)