【每日算法Day 78】面试经典题:能说出全部四种方法,不录用你都不可能!

简介: 给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。

题目链接


LeetCode 55. 跳跃游戏[1]

题目描述

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

示例1

输入:
[2,3,1,1,4]
输出:
true
解释:
我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。

示例2

输入:
[3,2,1,0,4]
输出:
false
解释:
无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

题解


动态规划+正推


image.png

动态规划+倒推



image.pngimage.pngimage.pngimage.png

image.png

贪心+正推



image.png

贪心+倒推



image.png

代码


动态规划+正推(c++)

classSolution {
public:  
boolcanJump(vector<int>&nums) {   
intn=nums.size();     
vector<int>dp(n, 0);  
dp[0] =1;     
for (inti=0; i<n; ++i) {   
if (!dp[i]) returnfalse;   
if (i+nums[i] >=n-1) returntrue; 
for (intj=i+1; j<=i+nums[i]; ++j) {  
dp[j] =1;    
            }     
        }     
returnfalse;
    }
};

动态规划+倒推(c++)

classSolution {
public:
boolcanJump(vector<int>&nums) {   
intn=nums.size();    
vector<int>dp(n, 0);  
dp[n-1] =1;     
for (inti=n-2; i>=0; --i) { 
if (i+nums[i] >=n-1) {  
dp[i] =1;     
continue;     
            }         
for (intj=i+1; j<=i+nums[i]; ++j) {  
dp[i] |=dp[j];      
if (dp[i]) break;    
            }   
        }    
returndp[0]; 
    }
};

贪心+正推(c++)

classSolution {
public: 
boolcanJump(vector<int>&nums) { 
intn=nums.size(), maxx=0;  
for (inti=0; i<n; ++i) {   
if (i>maxx) returnfalse; 
maxx=max(maxx, i+nums[i]); 
        }       
returnmaxx>=n-1; 
    }
};

贪心+倒推(c++)

classSolution {
public:  
boolcanJump(vector<int>&nums) { 
intn=nums.size(), minn=n-1; 
for (inti=n-2; i>=0; --i) {  
if (i+nums[i] >=minn) minn=i;
        }       
return!minn;  
    }
};

参考资料


[1]

LeetCode 55. 跳跃游戏: https://leetcode-cn.com/problems/jump-game/


image.png

作者简介:godweiyang知乎同名华东师范大学计算机系硕士在读,方向自然语言处理与深度学习喜欢与人分享技术与知识,期待与你的进一步交流~

相关文章
|
4月前
|
前端开发
【面试题】吃透Promise?先实现一个再说(包含所有方法)(二)
【面试题】吃透Promise?先实现一个再说(包含所有方法)(二)
|
4月前
|
存储 运维 前端开发
【面试题】吃透Promise?先实现一个再说(包含所有方法)(一)
【面试题】吃透Promise?先实现一个再说(包含所有方法)(一)
|
6月前
|
Java Linux 程序员
Linux平台中调试C/C++内存泄漏方法 (腾讯和MTK面试的时候问到的)
Linux平台中调试C/C++内存泄漏方法 (腾讯和MTK面试的时候问到的)
|
7月前
|
Java
每日一道面试题之String常用的方法有哪些?
每日一道面试题之String常用的方法有哪些?
|
7月前
|
存储 Java
【面试题精讲】为什么重写equals时必须重写hashCode方法?
【面试题精讲】为什么重写equals时必须重写hashCode方法?
|
3月前
|
Java 编译器
探究Java【方法的定义及使用】----【简单面试题】
探究Java【方法的定义及使用】----【简单面试题】
31 2
|
7月前
每日一道面试题之Files的常用方法都有哪些?
每日一道面试题之Files的常用方法都有哪些?
|
8月前
|
安全
多线程访问同步方法的7种情况(面试常考)
多线程访问同步方法的7种情况(面试常考)
39 0
多线程访问同步方法的7种情况(面试常考)
|
6月前
|
缓存 NoSQL Java
面试~线程池-三大方法、七个参数、四种拒绝策略、实际应用
面试~线程池-三大方法、七个参数、四种拒绝策略、实际应用
47 0
|
8月前
|
存储 Java
【面试题精讲】你了解String.intern方法吗
【面试题精讲】你了解String.intern方法吗