/**
* @param {number[]} jump
* @return {number}
*/
var minJump = function(jump) {
const n = jump.length
const dp = new Array(n)
// 最后一个点直接就出去了
dp[n - 1] = 1
for(let i = n - 2; i >= 0; i--) {
// 先只考虑往后跳,能直接跳出去就直接跳出去,跳不出去就暂时往后跳
dp[i] = (jump[i] + i) >= n ? 1 : dp[jump[i] + i] + 1
// 在下一轮考虑往前跳, 修正前面的结果, 如果能以更小的代价跳出去, 那就更换跳的方式
for(let j = i + 1; (j < n) && (dp[j] >= (dp[i] + 1)); j++) dp[j] = dp[i] + 1
}
// 第一个点无法往前跳
return dp[0]
};