解法
对于负数,它的解跟正数的解一样,所以只要解正数就可以了
首先我们走n步,直到sum=1+...+n>=target
。
计算diff = target-sum
- 如果
diff
是偶数,那么diff/2
一定在[1,n]
之间,只要把+diff/2
改成-diff/2
,总和就会减少diff
了,所以步数为n
- 如果
diff
是奇数:- 如果再走一步差就变成偶数了,即
sum+(n+1)-target
为偶数,由于sum-target
为奇数,所以n得是偶数,最后步数就是n+1
。 - 否则,如果
diff=2k+1
,那么通过反转+k
为-k
那么就能得到target+1
,然后再走+(n+1)
步,再走-(n+2)
步就可以了,所以最后步数为n+2
- 如果再走一步差就变成偶数了,即
class Solution(object):
def reachNumber(self, t):
"""
:type target: int
:rtype: int
"""
t = abs(t)
n = int(math.ceil(((t<<1)+0.25)**0.5-0.5))
s = (1+n)*n//2
if (s-t)&1:
return n+2 if n&1 else n+1
return n