JAVA程序设计:到达终点(LeetCode:780)

从点 (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

注意:

sx, sy, tx, ty 是范围在 [1, 10^9] 的整数。

                                   

思路:这么一个题竟然是过一点点人的困难题~~~,思路很简单,因为正着考虑会导致分叉处很多情况,因为我们首先要想到的是倒着考虑问题,也就是如何让最终要到达的结果通过相减变成初始值,我们知道肯定不能小的减大的啊,所以我们每次只能大减小,这样这道题就解决了,遇到x和y相同时再分叉,当然我们不能乖乖的一点点的减,n有10^9这么大,这样一定会导致超时的,优化非常简单,每次尽可能大的减,但是要保证不能减到小于初始值!

class Solution {
    public boolean reachingPoints(int sx, int sy, int tx, int ty) {
    	
    	if(tx<sx || ty<sy) return false;
    	if(tx==sx && ty==sy) return true;
    		
    	if(tx>ty) {
    		int num=(tx-sx)/ty*ty;
    		return reachingPoints(sx,sy,tx-Math.max(num, ty),ty);
    	}
    	else if(tx<ty) {
    		int num=(ty-sy)/tx*tx;
    		return reachingPoints(sx,sy,tx,ty-Math.max(num, tx));
    	}
    	else return reachingPoints(sx, sy, tx-ty, ty)
    			|| reachingPoints(sx, sy, tx, ty-tx);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值