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