Your car starts at position 0 and speed +1 on an infinite number line. (Your car can go into negative positions.)
Your car drives automatically according to a sequence of instructions A (accelerate) and R (reverse).
When you get an instruction "A", your car does the following: position += speed, speed *= 2
.
When you get an instruction "R", your car does the following: if your speed is positive then speed = -1
, otherwise speed = 1
. (Your position stays the same.)
For example, after commands "AAR", your car goes to positions 0->1->3->3, and your speed goes to 1->2->4->-1.
Now for some target position, say the length of the shortest sequence of instructions to get there.
Example 1: Input: target = 3 Output: 2 Explanation: The shortest instruction sequence is "AA". Your position goes from 0->1->3.
Example 2: Input: target = 6 Output: 5 Explanation: The shortest instruction sequence is "AAARA". Your position goes from 0->1->3->7->7->6.
Note:
1 <= target <= 10000
.
为了减少memory使用量,只记录speed为1的
class Solution:
def racecar(self, target):
"""
:type target: int
:rtype: int
"""
res = 0
q,qq=[(1,0)],[]
vs = set()
vs.add((1,0))
while q:
while q:
ts,tp=q.pop()
if tp==target:
return res
if (2*ts,tp+ts) not in vs:
qq.append((2*ts,tp+ts))
# vs.add((2*ts,tp+ts)) # only start point need to be memoried
qq.append((-1 if ts>0 else 1,tp))
vs.add((-1 if ts>0 else 1,tp))
q,qq=qq,q
res+=1
s=Solution()
#print(s.racecar(3))
#print(s.racecar(6))
#print(s.racecar(5))
print(s.racecar(6102))