-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy path0818-race-car.js
52 lines (46 loc) · 1.37 KB
/
0818-race-car.js
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
/**
* 818. Race Car
* https://leetcode.com/problems/race-car/
* Difficulty: Hard
*
* 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.
*
* Given a target position target, return the length of the shortest sequence of instructions
* to get there.
*/
/**
* @param {number} target
* @return {number}
*/
var racecar = function(target) {
const dp = new Array(target + 1).fill(Infinity);
dp[0] = 0;
for (let i = 1; i <= target; i++) {
const k = Math.ceil(Math.log2(i + 1));
if ((1 << k) - 1 === i) {
dp[i] = k;
continue;
}
dp[i] = k + 1 + dp[(1 << k) - 1 - i];
for (let j = 0; j < k - 1; j++) {
dp[i] = Math.min(
dp[i],
(k - 1) + 1 + j + 1 + dp[i - ((1 << (k - 1)) - 1) + (1 << j) - 1]
);
}
}
return dp[target];
};