系列文章目录
前言
每天进步一点点!!
一、背景
解释一下题目,从下标0开始,你可以跳的最大长度为当前元素的值,问:可不可以跳到最后一个下标?
二、我的思路
开始就想到的是递归,先跳最大步数,最大步数不行,那就减一步,可想而知,这样最大的复杂度就是每个数组元素相乘,肯定超时!!
但我还是依据我固有的办法,不管管不管用,先写下来,对,贴个代码:
class Solution {
public:
bool flag=false;
void panDuan(vector<int>& nums,int x)//x为当前下标
{
if (x<nums.size()-1 && nums[x]==0 )
{
flag=false;
return;
}
if (x>=nums.size()-1)
{
flag=true;
return;
}
for (int i=nums[x];i>0;i--)
{
if(flag==true)
break;
panDuan(nums,x+i);
}
}
bool canJump(vector<int>& nums) {
//初步使用递归来做
//结束条件1:当前数组元素值为0
//结束条件2:当前下标+数组元素值(>0)>=nums.size()-1
panDuan(nums,0);
return flag;
}
};
最后是通过了75个用例呢,然后就超时了!!
三、官方的思路
1.贪心
怎么个贪心法呢,当前位置跳最大步数,不过他不是像我一样,用递归,一个个去试。
它是用一个max_arrive记录可到达的最远位置,如果到最后一个元素了,这个max——arrive都还么有达到最后一个下标,说明不可达,在访问每一个元素的时候,同时更新最大可到达位置。
代码如下:
class Solution {
public:
bool canJump(vector<int>& nums) {
int maxArrive=nums[0];
for (int i=1; i<nums.size(); i++ )
{
if ( i > maxArrive)
{
return false;
}
maxArrive=max(maxArrive,i+nums[i]);
}
return true;
}
};
2.优化一下
代码如下:
class Solution {
public:
bool canJump(vector<int>& nums) {
int maxArrive=nums[0];
for (int i=1; i<nums.size(); i++ )
{
if ( i > maxArrive)
{
return false;
}
maxArrive=max(maxArrive,i+nums[i]);
//优化一下
if (maxArrive>=nums.size()-1)
{
return true;
}
}
return true;
}
};
如果最大可到达的已经大于等于最大的下标,就无需进行遍历了!
优化情况:
总结
加油!不会做就不死磕,没必要,刷题嘛!!!
喜欢就点个赞叭!!