• leetcode - 780. Reaching Points


    Description

    Given four integers sx, sy, tx, and ty, return true if it is possible to convert the point (sx, sy) to the point (tx, ty) through some operations, or false otherwise.

    The allowed operation on some point (x, y) is to convert it to either (x, x + y) or (x + y, y).

    Example 1:

    Input: sx = 1, sy = 1, tx = 3, ty = 5
    Output: true
    Explanation:
    One series of moves that transforms the starting point to the target is:
    (1, 1) -> (1, 2)
    (1, 2) -> (3, 2)
    (3, 2) -> (3, 5)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    Example 2:

    Input: sx = 1, sy = 1, tx = 2, ty = 2
    Output: false
    
    • 1
    • 2

    Example 3:

    Input: sx = 1, sy = 1, tx = 1, ty = 1
    Output: true
    
    • 1
    • 2

    Constraints:

    1 <= sx, sy, tx, ty <= 10^9
    
    • 1

    Solution

    Shrink 1by1

    The possibilities are like a binary tree, use example 1:

    			   1,1
    			/		\
    		1,2			2,1
    		/	\		/ \
    	1,3		3,2	  2,3 	3,1
    	/ \		/ \		/\
      1,4  4,3 3,5 5,2 ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    So instead of searching from the sx, sy, which is the top of the tree, we could start from the leaf, which is the tx, ty

    Note that:
    t x , t y = { s x , s x + s y s x + s y , s y tx, ty = {sx,sx+sysx+sy,sy tx,ty={sx,sx+sysx+sy,sy
    So every time shrink the smaller one from tx, ty, which means find the parent of the node, until we find the source node.

    Time complexity: o ( log ⁡ max ⁡ ( t x , t y ) ) o(\log \max(tx, ty)) o(logmax(tx,ty))
    Space complexity: o ( 1 ) o(1) o(1)

    Shrink by potential maximum

    It’s too slow to shrink one node at a time, we could shrink to the number that is larger than sx or sy

    Code

    Shrink 1by1 (TLE)

    class Solution:
        def reachingPoints(self, sx: int, sy: int, tx: int, ty: int) -> bool:
            while (tx != sx or ty != sy) and tx >= 1 and ty >= 1:
                if tx > ty:
                    tx, ty = tx % ty, ty
                else:
                    tx, ty = tx, ty % tx
            return tx == sx and ty == sy
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Shrink by potential maximum

    class Solution:
        def reachingPoints(self, sx: int, sy: int, tx: int, ty: int) -> bool:
            while (tx != sx or ty != sy) and tx >= 1 and ty >= 1:
                if tx > ty:
                    multi_factor = max(1, (tx - sx) // ty)
                    tx, ty = tx - multi_factor * ty, ty
                else:
                    multi_factor = max(1, (ty - sy) // tx)
                    tx, ty = tx, ty - tx * multi_factor
            return tx == sx and ty == sy
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    定制开发一款家政小程序,应知应会
    stm32cubemx hal学习记录:FreeRTOS事件
    操作系统:系统调用
    shopify motion主题如何更换视频
    如何使用Postman调试HMS Core推送接口?
    【学计算机都可收藏】《信息资源管理》第6章,信息资源安全管理
    【博客458】BGP(边界网关协议)-----状态机
    基于TCP的文件服务器
    考过HCIP依然转行失败,职业网工最看重的到底是什么
    nuxt页面访问速度优化
  • 原文地址:https://blog.csdn.net/sinat_41679123/article/details/133938392