leetcode55跳跃游戏
给你一个非负整数数组 nums
,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true
;否则,返回 false
。
传统递归解法:
很慢,但是一眼就能想到,类似n皇后解法,递归+回溯
public boolean canJump(int[] nums) {
return check(nums,0);
}
private boolean check(int[] nums ,int index) {
if(nums[index] >= nums.length - 1 - index){
return true;
}else{
for (int i = nums[index]; i > 0 ; i--) {
if (nums[index + i] != 0) {
boolean flag = check(nums, index + i);
if(flag){
return flag;
}else{
nums[index + i] = 0;
}
}
}
}
return false;
}
贪心+递归
贪心思想,倒着找,找到一个就递归以这个为终点继续找
//贪心 + 递归
private boolean check(int[] nums ,int index) {
for (int i = index - 1; i >= 0; i--) {
if (nums[i] >= index - i) {
if(i == 0){
return true;
}else{
return check(nums,i);
}
}
}
return false;
}
//贪心
public boolean canJump(int[] nums) {
int cover = nums[0];
for (int i = 0; i <= cover; i++) {
if(cover >= nums.length-1){
return true;
}
cover = Math.max(cover,nums[i] + i);
}
return false;
}