zoukankan      html  css  js  c++  java
  • LeetCode----到达终点

    题目描述

    从点 (x, y) 可以转换到 (x, x+y)  或者 (x+y, y)
    给定一个起点 (sx, sy) 和一个终点 (tx, ty)
    如果通过一系列的转换可以从起点到达终点,则返回 True ,否则返回 False

    示例:

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

    解释:

    可以通过以下一系列转换从起点转换到终点:
    (1, 1) -> (1, 2)
    (1, 2) -> (3, 2)
    (3, 2) -> (3, 5)

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

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

    思路

    每次有 2 个选择,如果从起点往前走,就是一个二叉树,后面结果越来越多
    既然给定了终点(虽然不一定有给定起点),但是倒着走回去只有一条路
    当往回走的过程中,点都小于起点坐标,说明一定不会经过给定起点

    代码

    class Solution {
        public boolean reachingPoints(int sx, int sy, int tx, int ty) {
            if(sx == tx && sy == ty) return true;
            if(sx > tx || sy > ty) return false;
            if(tx > ty) {
                tx -= ty;                              // 先走一步再说(没病走两步~)
                tx -= tx-ty > sx ? (tx-sx)/ty*ty : 0;  // 如果 2 者差值太大,会导致栈溢出,那就跨一大步,省去不必要递归
            } else {
                ty -= tx;
                ty -= ty-tx > sy ? (ty-sy)/tx*tx : 0;
            }
            return reachingPoints(sx, sy, tx, ty);
        }
    }
    
  • 相关阅读:
    hdu1085
    hdu1028
    hdu2189
    母函数
    博弈论
    nginx安装
    学习好站点
    nginx在linux下安装
    wget 命令用法详解
    U盘安装CentOS7的帖子
  • 原文地址:https://www.cnblogs.com/qq188380780/p/11645842.html
Copyright © 2011-2022 走看看