给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
示例 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
————————
解题思路:使用贪心算法,设定一个标记值
i
n
d
e
x
index
index,标记值
i
n
d
e
x
index
index初始值为数组
n
u
m
s
nums
nums的终点位置,从倒数第二个数
n
u
m
s
[
i
]
nums[i]
nums[i]往前
(
i
⇒
0
)
(i\Rightarrow 0)
(i⇒0)遍历,查看是否存在满足条件的情况:
n
u
m
s
[
i
]
+
i
>
=
i
n
d
e
x
nums[i]+i>=index
nums[i]+i>=index如果满足条件,则把
i
n
d
e
x
index
index的值改为:
i
n
d
e
x
=
i
index=i
index=i然后继续遍历,最后对
i
n
d
e
x
index
index进行判断。如果
i
n
d
e
x
index
index的值为0,表示能到达数组终点。
因为从 i n d e x index index所在的位置是一定能到达终点的,所以如果存在 n u m s [ i ] + i > = i n d e x nums[i]+i>=index nums[i]+i>=index那么意思就是存在 i i i能到达 i n d e x index index所在的位置,所以从 i i i能到达终点。
具体的c++代码如下:
class Solution {
public:
bool canJump(vector<int>& nums) {
int index = nums.size()-1; # 初始化index为数组终点
for(int i=nums.size()-1;i>=0;--i)
{
if(nums[i]+i>=index) # 如果符合判断条件
index = i; # 更新index的值
}
return index==0; # 判断index是否为0,为0则返回true
}
};
个人解法:因为只要数组中不存在0,则数组是一定可以从起点到达终点的。因为数组是非负数组,所以一定存在元素0。设0元素所在的索引为 i n d e x index index,这时候就要判断从起始点到0这段距离内,是否存在元素 n u m s [ i ] nums[i] nums[i]使得 n u m s [ i ] + i > i n d e x nums[i]+i>index nums[i]+i>index如果该条件成立,则数组可以跳过零元素继续向前移动;但是注意当0元素位于数组终点时,判断条件为 n u m s [ i ] + i > = i n d e x nums[i]+i>=index nums[i]+i>=index其C++代码为
class Solution {
public:
int dfs(vector<int>& nums,int n) # 递归函数,n是数组nums中零元素所在的位置
{
for(int i=0;i<n;i++) # 遍历从起始点到零元素
{
if(nums[i]+i>n && n!=nums.size()-1) # 如果零元素所在的位置不是数组终点
return 1;
else if(nums[i]+i>=n && n==nums.size()-1) # 如果零元素所在的位置是数组的终点
return 1;
}
return 0; # 不能跳过零元素,则直接返回0
}
bool canJump(vector<int>& nums) {
int flag = 1; # 标记flag,当为1时表示能从起点到终点,当为0时表示不能
if(nums.size()==1) # 当数组长度为1时,一定可以到达终点,所以返回1
return 1;
for(int i=0;i<nums.size();i++) # 遍历数组,寻找零元素的位置
{
if(nums[i]!=0) # 如果当前元素不为零,直接跳过
continue;
if(nums[i]==0) # 如果当前元素为零,进入判断函数
flag = dfs(nums,i);
if(flag==0) # 当flag为0时,表示存在元素0不能跳过,直接跳出循环,返回flag
break;
}
return flag;
}
};