JavaScript / TypeScript for LeetCode
当前进程:
开始时间:2020.6.27结束时间:undefined
GitHub仓库:https://github.com/Cundefined/JavaScript-or-TypeScript-for-LeetCode
参考视频:https://www.bilibili.com/video/BV1wA411b7qZ
1、题目要求
( LeetCode-第55题 ) 跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。
示例 1:
输入
: [2,3,1,1,4]
输出
: true
解释
: 我们可以先跳
1 步,从位置
0 到达 位置
1, 然后再从位置
1 跳
3 步到达最后一个位置。
示例 2:
输入
: [3,2,1,0,4]
输出
: false
解释
: 无论怎样,你总会到达索引为
3 的位置。但该位置的最大跳跃长度是
0 , 所以你永远不可能到达最后一个位置。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/jump-game 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2、解题思路
解题思路:动态规划、贪心算法
方法一、动态规划【自上而下,开头到结尾-递归】方法二、动态规划【自下而上,结尾到开头】方法三、贪心算法
三种方法的具体步骤见JS代码块中(写太多啦,偷下懒)
2.1、JavaScript Solution
方法一、动态规划【自上而下,开头到结尾-递归】
var canJump = function (nums
) {
const memo
= Array(nums
.length
).fill(0);
memo
[nums
.length
- 1] = 1;
function jump(position
) {
if (memo
[position
] === 1) {
return true;
} else if (memo
[position
] === -1) {
return false;
}
const MaxJumpDistance
= Math
.min(
position
+ nums
[position
],
nums
.length
- 1
);
for (let i
= position
+ 1; i
<= MaxJumpDistance
; i
++) {
const isCanThrough
= jump(i
);
if (isCanThrough
=== true) {
memo
[position
] = 1;
return true;
}
}
memo
[position
] = -1;
return false;
}
let isCanThrough
= jump(0);
return isCanThrough
;
};
方法二、动态规划【自下而上,结尾到开头】
var canJump = function (nums
) {
const memo
= Array(nums
.length
).fill(0);
memo
[nums
.length
- 1] = 1;
for (let i
= nums
.length
- 2; i
>= 0; i
--) {
const MaxJumpDistance
= Math
.min(i
+ nums
[i
], nums
.length
- 1);
for (let j
= i
+ 1; j
<= MaxJumpDistance
; j
++) {
if (memo
[j
] === 1) {
memo
[i
] = 1;
break;
}
}
}
if (memo
[0] === 1) {
return true;
} else {
return false;
}
};
方法三、贪心算法
var canJump = function (nums
) {
let endPosition
= nums
.length
- 1;
for (let i
= nums
.length
- 2; i
>= 0; i
--) {
if (i
+ nums
[i
] >= endPosition
) {
endPosition
= i
;
}
}
return endPosition
=== 0;
};
2.2、TypeScript Solution
方法一、动态规划【自上而下,开头到结尾-递归】
function canJump(nums
: number
[]): boolean
{
const memo
: number
[] = Array(nums
.length
).fill(0);
memo
[nums
.length
-1] = 1;
function jump(position
: number
): boolean
{
if (memo
[position
] === 1) {
return true;
} else if (memo
[position
] === -1){
return false;
}
let MaxJumpDistance
: number
= Math
.min(position
+ nums
[position
], nums
.length
-1);
for (let i
: number
= position
+ 1; i
<= MaxJumpDistance
; i
++) {
let isCanThrough
= jump(i
);
if (isCanThrough
=== true) {
memo
[position
] = 1;
return true;
}
}
memo
[position
] = -1;
return false;
}
let isCanThrough
: boolean
= jump(0);
return isCanThrough
;
};
方法二、动态规划【自下而上,结尾到开头】
function canJump(nums
: number
[]): boolean
{
const memo
: number
[] = Array(nums
.length
).fill(0);
memo
[nums
.length
-1] = 1;
for (let i
: number
= nums
.length
- 2; i
>= 0; i
--) {
let MaxJumpDistance
: number
= Math
.min(i
+ nums
[i
], nums
.length
-1);
for (let j
: number
= i
+ 1; j
<= MaxJumpDistance
; j
++) {
if (memo
[j
] === 1) {
memo
[i
] = 1;
break;
}
}
}
return memo
[0] === 1;
}
方法三、贪心算法
function canJump(nums
: number
[]): boolean
{
let endPosition
: number
= nums
.length
- 1;
for (let i
: number
= nums
.length
- 2; i
>= 0; i
--) {
if (i
+ nums
[i
] >= endPosition
) {
endPosition
= i
;
}
}
return endPosition
=== 0;
}