forked from shuboc/LeetCode-2
-
Notifications
You must be signed in to change notification settings - Fork 0
/
reach-a-number.py
57 lines (51 loc) · 1.32 KB
/
reach-a-number.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# Time: O(logn)
# Space: O(1)
# You are standing at position 0 on an infinite number line. There is a goal at position target.
#
# On each move, you can either go left or right.
# During the n-th move (starting from 1), you take n steps.
#
# Return the minimum number of steps required to reach the destination.
#
# Example 1:
# Input: target = 3
# Output: 2
# Explanation:
# On the first move we step from 0 to 1.
# On the second step we step from 1 to 3.
#
# Example 2:
# Input: target = 2
# Output: 3
# Explanation:
# On the first move we step from 0 to 1.
# On the second move we step from 1 to -1.
# On the third move we step from -1 to 2.
#
# Note:
# - target will be a non-zero integer in the range [-10^9, 10^9].
import math
class Solution(object):
def reachNumber(self, target):
"""
:type target: int
:rtype: int
"""
target = abs(target)
k = int(math.ceil((-1+math.sqrt(1+8*target))/2))
target -= k*(k+1)/2
return k if target%2 == 0 else k+1+k%2
# Time: O(sqrt(n))
# Space: O(1)
class Solution2(object):
def reachNumber(self, target):
"""
:type target: int
:rtype: int
"""
target = abs(target)
k = 0
while target > 0:
k += 1
target -= k
return k if target%2 == 0 else k+1+k%2