![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/04e9b8b01cc66f69816c1480efbd9a9f.png)
C++ dfs+剪枝,超时,卡在最后一个样例,优化一下勉强过
class Solution {
public:
bool vis[30011];
bool isok = false;
void dfs(int i,vector<int>& nums){
int len = nums.size();
if(isok) return;
if(vis[i]) return;
if(i == len-1){
isok = true;
return;
}
for(int k = nums[i]; k >= 1; k--){
if(i+k < len){
dfs(i+k,nums);
vis[i+k] = 1;
}
}
}
bool canJump(vector<int>& nums) {
memset(vis,0,sizeof(vis));
int len = nums.size();
dfs(0,nums);
if(isok) return true;
return false;
}
};
优化勉强过
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e1efde5b40d1c8b39c4d7527a6c0511f.png)
void dfs(int i,vector<int>& nums){
int len = nums.size();
if(isok) return;
vis[i] = 1;
if(i == len-1){
isok = true;
return;
}
for(int k = nums[i]; k >= 1; k--){
if(i+k < len){
if(!vis[i+k])
dfs(i+k,nums);
}
}
}
C++ 贪心
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f61dea10fcde7458fbf721aa2115085f.png)
- 当nums数组中,没有0,肯定可以到达
- 当数组大小为2时,肯定可以到达
- 设当前能到达的最大距离是nums[0];
- 从第二个数的下标开始遍历,如果当前值在maxDistance之内,说明,前面的值可以到达此值,那么该值可以继续向后面传递,maxDistance就更新
- 如果遍历到某个值,i,< maxDistance,就返回false
class Solution {
public:
bool canJump(vector<int>& nums) {
int len = nums.size();
if(len == 1) return true;
int maxDistance = nums[0];
for(int i = 1; i < len; i++){
if(i <= maxDistance) maxDistance = max(maxDistance,i+nums[i]);
else return false;
}
return true;
}
};
java 贪心
class Solution {
public boolean canJump(int[] nums) {
int maxAns = nums[0];
for(int i = 1; i < nums.length; i++){
if(i <= maxAns) maxAns = Math.max(maxAns,i+nums[i]);
else return false;
}
return true;
}
}