跳跃游戏|
题目
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
题解| 贪心算法
对于每一个值来说,i + nums[i]
是可以到达的最远位置,如果这个位置>=nums.size() - 1
,那么就可以到达最远位置,设置一个maxstep
遍历数组的时候去不断更新这个值。
class Solution {
public:
bool canJump(vector<int>& nums) {
int n = nums.size();
int maxstep = 0;
for(int i = 0; i < n; ++i){
if(i <= maxstep){
maxstep = max(i + nums[i], maxstep);
if(maxstep >= n - 1)
return true;
}
}
return false;
}
};
题解||
专门用一个Jump
容器,第一次遍历来记录每个点可以到达的最远值,第二次遍历判断这个值的大小。
class Solution {
public:
bool canJump(vector<int>& nums) {
int Length=nums.size();
vector<int> Jump(Length,0);
for(int i=0;i<Length;i++)
Jump[i]=i+nums[i];
int index=0,MaxJump=Jump[0];
for(;index<=MaxJump && index<Length;index++){
if(Jump[index]>MaxJump)
MaxJump=Jump[index];
}
if(MaxJump>=Length-1)
return true;
else
return false;
}
};
跳跃游戏 ||
题目
给你一个非负整数数组 nums ,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
类似与上题解法,利用贪心不断更新最大可到达的距离,并及时更新curdistance
,当i == curdistance
时,说明已经到达了上次可达到的最远距离,进行更新curdistance
class Solution {
public:
int jump(vector<int>& nums) {
int res = 0;
int n = nums.size();
int curdistance = 0;
int maxdistance = 0;
for (int i = 0; i < n - 1; i++) {
maxdistance = max(maxdistance, i + nums[i]);
//如果当前跳的距离可以到达最后位置则跳一步可以退出循环
if (maxdistance >= n - 1) {
res++;
break;
}
//如果到达上一次跳的最远的右边界
if (i == curdistance) {
curdistance = maxdistance;
res++;
}
}
return res;
}
};