Skip to content

Commit e7f94f9

Browse files
committed
leetcode(45-jump-game-ii): working solution
1 parent ca650b3 commit e7f94f9

File tree

1 file changed

+58
-3
lines changed

1 file changed

+58
-3
lines changed

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

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ test('solves jump list', t => {
99

1010
test('solves jump list - with zero as value', t => {
1111
t.is(solve([2, 3, 1, 0, 4]), 2)
12+
t.is(solve([1, 2, 0, 1]), 2) // 60th test case
1213
})
1314

1415
test('solves jump list - empty list', t => {
@@ -25,27 +26,81 @@ test('solves jump list - two items', t => {
2526
t.is(solve([2, 1]), 1)
2627
})
2728

29+
test('multiple ones', t => {
30+
t.is(solve([1, 2, 1, 1, 1]), 3) // 65th test case
31+
})
32+
2833
test('solves jump list - large list', t => {
2934
const size = 50000
3035
t.is(solve(new Array(size).fill(1)), size - 1)
3136
})
3237

33-
test.skip('solves jump list - large descending list', t => {
38+
test('solves jump list - large descending list', t => {
3439
const size = 25000
3540
const input = new Array(size).fill(1).map((_, idx) => size - idx)
3641
t.is(solve(input), 1)
3742
})
3843

39-
test.skip('solves jump list - large descending list twice', t => {
44+
test('solves jump list - large descending list twice', t => {
4045
const size = 25000
4146
const list = new Array(size).fill(1).map((_, idx) => size - idx)
4247
t.is(solve(list.concat(list)), 2)
4348
})
4449

50+
test('solves jump list - value greater than prev', t => {
51+
t.is(solve([4, 3, 1]), 1)
52+
t.is(solve([4, 1, 3, 1]), 1)
53+
})
54+
55+
test('solves jump list - value less than prev', t => {
56+
t.is(solve([2, 4, 2]), 1)
57+
t.is(solve([4, 5, 2, 4, 2]), 1)
58+
})
59+
4560
const solve = (jumps) =>
46-
solveI(jumps)
61+
solveI2(jumps)
62+
// solveI(jumps)
4763
// solveR(jumps)[0]
4864

65+
const solveI2 = (jumps) => {
66+
const len = jumps.length
67+
if (len <= 1) {
68+
return 0
69+
}
70+
71+
const map = new Array(jumps.length).fill(0).map((_, idx) => ([Infinity, idx]))
72+
map[len - 1] = [0, 0]
73+
74+
for (let idx = len - 2; idx >= 0; idx--) {
75+
const curJumps = jumps[idx]
76+
77+
// deadend - leave as infinity
78+
if (curJumps === 0) {
79+
map[idx] = [Infinity, 0]
80+
continue
81+
}
82+
83+
const [prevC, prevUsed] = map[idx + 1]
84+
let [bestC, bestUsed] = [prevC + 1, 1] // zero case to be handled later
85+
const diff = curJumps - prevUsed
86+
const prevEnd = idx + prevUsed + 1
87+
88+
if (diff > 0) {
89+
for (let pos = prevEnd; pos < Math.min(prevEnd + diff, len); pos++) {
90+
const [candidateC] = map[pos]
91+
if (candidateC + 1 < bestC) {
92+
bestC = candidateC + 1
93+
bestUsed = pos - idx
94+
}
95+
}
96+
}
97+
98+
map[idx] = [bestC, bestUsed]
99+
}
100+
101+
return map[0][0]
102+
}
103+
49104
const solveI = (jumps) => {
50105
const len = jumps.length
51106
if (len <= 1) {

0 commit comments

Comments
 (0)