Skip to content

Commit ca650b3

Browse files
committed
leetcode(45-jump-game-ii): partial solution to jump game
1 parent e8e3504 commit ca650b3

File tree

1 file changed

+108
-0
lines changed

1 file changed

+108
-0
lines changed

leetcode/45-jump-game-ii.test.js

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
// https://leetcode.com/problems/jump-game-ii/
2+
3+
import test from 'ava'
4+
import { memoizeWith } from '../helpers'
5+
6+
test('solves jump list', t => {
7+
t.is(solve([2, 3, 1, 1, 4]), 2)
8+
})
9+
10+
test('solves jump list - with zero as value', t => {
11+
t.is(solve([2, 3, 1, 0, 4]), 2)
12+
})
13+
14+
test('solves jump list - empty list', t => {
15+
t.is(solve([]), 0)
16+
})
17+
18+
test('solves jump list - singleton', t => {
19+
t.is(solve([0]), 0)
20+
t.is(solve([1]), 0)
21+
})
22+
23+
test('solves jump list - two items', t => {
24+
t.is(solve([1, 2]), 1)
25+
t.is(solve([2, 1]), 1)
26+
})
27+
28+
test('solves jump list - large list', t => {
29+
const size = 50000
30+
t.is(solve(new Array(size).fill(1)), size - 1)
31+
})
32+
33+
test.skip('solves jump list - large descending list', t => {
34+
const size = 25000
35+
const input = new Array(size).fill(1).map((_, idx) => size - idx)
36+
t.is(solve(input), 1)
37+
})
38+
39+
test.skip('solves jump list - large descending list twice', t => {
40+
const size = 25000
41+
const list = new Array(size).fill(1).map((_, idx) => size - idx)
42+
t.is(solve(list.concat(list)), 2)
43+
})
44+
45+
const solve = (jumps) =>
46+
solveI(jumps)
47+
// solveR(jumps)[0]
48+
49+
const solveI = (jumps) => {
50+
const len = jumps.length
51+
if (len <= 1) {
52+
return 0
53+
}
54+
55+
const map = new Array(jumps.length).fill(Infinity)
56+
map[len - 1] = 0
57+
58+
for (let idx = len - 2; idx >= 0; idx--) {
59+
let bestJump = Infinity
60+
for (let x = jumps[idx]; x >= 1; x--) {
61+
const prev = map[idx + x]
62+
const prevC = prev === undefined ? Infinity : prev
63+
bestJump = Math.min(prevC + 1, bestJump)
64+
}
65+
map[idx] = bestJump
66+
}
67+
68+
return map[0]
69+
}
70+
71+
const jumpOpts = length => new Array(length)
72+
.fill(0)
73+
.map((_, idx) => idx + 1)
74+
75+
const solveR = memoizeWith(
76+
(jumps, index) => `${jumps.join('_')}:${index}`,
77+
(jumps, index = 0) => {
78+
const leftToJump = jumps.length - index
79+
80+
if (leftToJump <= 1) {
81+
return [0, index]
82+
}
83+
84+
const opts = jumpOpts(jumps[index])
85+
.map(x => {
86+
const [sC, sIdx] = solveR(jumps, index + x)
87+
return [sC + 1, sIdx - x]
88+
})
89+
90+
if (opts.length === 0) {
91+
return [Infinity, Infinity]
92+
}
93+
94+
return opts.reduce(best)
95+
}
96+
)
97+
98+
const best = ([bestCount, bestIdx], [curCount, curIdx]) => {
99+
if (curIdx < bestIdx) {
100+
return [curCount, curIdx]
101+
}
102+
103+
if (curIdx === bestIdx && curCount < bestCount) {
104+
return [curCount, curIdx]
105+
}
106+
107+
return [bestCount, bestIdx]
108+
}

0 commit comments

Comments
 (0)