Reach a Number

https://leetcode.cn/problems/reach-a-number/

# 假设target=4,
# 一直累加步数,直到其正好大于等于target
# 0 + 1 + 2 + 3 = 6
# 此时累加和已经大于target,且差值为偶数6-4=2;那么实际上只要将加上距离为1的时候,不加1,而是加 -1,那么此时累加和就损失了2,那么正好能到目标值4。0-1+2+3 = 4.
# 也就是,当 累加和 - target = 偶数d时,只需将第 d // 2 步的距离取反,就能得到目标值

# 如果 累加和 - target = 奇数d时,且当前为第n步,那么看下一步n+1的奇偶,
# 如果 n+1 为奇数,则加上 n+1 再做差,得到的差值就为偶数了,问题解决,
# 如果 n+1 为偶数,则还得加上 n+2 这个奇数,才能让差值为偶数,这样就多加了两步。

def reachNumber1(self, target: int) -> int:
        target = abs(target)
        k = 0
        sum = 0
        while sum < target or (sum - target) & 1 == 1:
            k += 1
            sum += k
        
        return k

    
    def reachNumber(self, target: int) -> int:
        target = abs(target)
        k = 0
        sum = 0
        while (sum < target):
            k += 1
            sum += k 
        
        d = sum - target
        if d & 1 == 0: return k 
        return (k+1) + (k&1)

https://youtu.be/Bdw2Y9FrqcU
https://www.cnblogs.com/grandyang/p/8456022.html

posted @ 2022-11-07 07:33  7aughing  阅读(15)  评论(0编辑  收藏  举报