818. Race Car

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))

猜你喜欢

转载自blog.csdn.net/zjucor/article/details/79949989
car