Welcome to Subscribe On Youtube
818. Race Car
Description
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
- If your speed is positive then
For example, after commands "AAR"
, your car goes to positions 0 --> 1 --> 3 --> 3
, and your speed goes to 1 --> 2 --> 4 --> -1
.
Given a target position target
, return 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.
Constraints:
1 <= target <= 104
Solutions
-
class Solution { public int racecar(int target) { int[] dp = new int[target + 1]; for (int i = 1; i <= target; ++i) { int k = 32 - Integer.numberOfLeadingZeros(i); if (i == (1 << k) - 1) { dp[i] = k; continue; } dp[i] = dp[(1 << k) - 1 - i] + k + 1; for (int j = 0; j < k; ++j) { dp[i] = Math.min(dp[i], dp[i - (1 << (k - 1)) + (1 << j)] + k - 1 + j + 2); } } return dp[target]; } }
-
class Solution { public: int racecar(int target) { vector<int> dp(target + 1); for (int i = 1; i <= target; ++i) { int k = 32 - __builtin_clz(i); if (i == (1 << k) - 1) { dp[i] = k; continue; } dp[i] = dp[(1 << k) - 1 - i] + k + 1; for (int j = 0; j < k; ++j) { dp[i] = min(dp[i], dp[i - (1 << (k - 1)) + (1 << j)] + k - 1 + j + 2); } } return dp[target]; } };
-
class Solution: def racecar(self, target: int) -> int: dp = [0] * (target + 1) for i in range(1, target + 1): k = i.bit_length() if i == 2**k - 1: dp[i] = k continue dp[i] = dp[2**k - 1 - i] + k + 1 for j in range(k - 1): dp[i] = min(dp[i], dp[i - (2 ** (k - 1) - 2**j)] + k - 1 + j + 2) return dp[target]
-
func racecar(target int) int { dp := make([]int, target+1) for i := 1; i <= target; i++ { k := bits.Len(uint(i)) if i == (1<<k)-1 { dp[i] = k continue } dp[i] = dp[(1<<k)-1-i] + k + 1 for j := 0; j < k; j++ { dp[i] = min(dp[i], dp[i-(1<<(k-1))+(1<<j)]+k-1+j+2) } } return dp[target] }