1、题目介绍
- 题目详情【编号55】
- 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
- 数组中的每个元素代表你在该位置可以跳跃的最大长度。
- 判断你是否能够到达最后一个下标。
2、我的思路及代码
class Solution {
public boolean canJump(int[] nums) {
/**
方法一:时间O(n),空间O(n)
1、使用深度优先遍历,并创建一个数组标记是否该数组跳跃遍历过。
2、从下标0开始遍历可跳跃的数组下标,每次遍历将数组标记为true(初始为false)。
3、每次遍历跳跃0~a[start]次不等,每次跳跃前检查是否数组标记为false。
4、只有为false时才将相应下标自建数组标记为true。
5、直到检测到达跳跃或者超过最后一个数组下标才直接跳出循环。
*/
//临时数组会全自动初始化为flase
return canJumpToo(nums, new boolean[nums.length], 0, nums.length - 1);
}
public boolean canJumpToo(int[] nums, boolean[] a, int start, int end){
int n = nums.length;
boolean flag = false;
int count = start + nums[start];
if(count >= n - 1){
return true;
}
if(a[start]){
return false;
}
a[start] = true;
for(int j = start + 1; j <= count; j++){
flag = flag || canJumpToo(nums, a, j, count + 1);
}
return flag;
}
}
3、官方题解
4、结论
- 这题我想的还是有些复杂了,额外利用了递归+数组,也就是额外空间能力去遍历了所有能到达的地方。
- 其实只要简单判断能跳跃的最大数组长度+遍历即可,而我是暴力遍历+递归+数组,数组不算啥,而这个递归是非常耗时的,以后在算法方面少用。