LeetCode第55题跳跃游戏

继续打卡算法题,今天学习的是LeetCode第55题跳跃游戏,这道题目是道中等题。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些提升。

分析一波题目

之前做过了第45题跳跃游戏II 本题其实更简单,第45题是一定可以跳跃到最后一个位置,求最少跳跃到末尾位置的次数,而本题是不一定可以跳跃到末尾位置。

我们只要把当前时刻可以到达的最大位置保存下来,每次判断当前位置是否可以到达,或者当前位置是否可以到达最后的位置。 这个思路就是先求局部最优的解,然后根据局部最优的解可以推导出全局最优解。

以[2,3,1,1,4] 为例子

第1次遍历到位置1,此刻最大可以到达下标(0+2)=2

第2次遍历到位置2,此刻位置可以到达,且当前位置可以最大可以到达下标(1+3)=4的位置,

第3次遍历到位置3,此刻位置可以到达,且当前位置可以到达的下标(2+1)=3位置,这个时候发现,前面位置可以到达的位置更远。

第4次遍历到位置4,此刻位置可以到达,且当前位置可以到达下标(1+3)位置,此刻发现已经到达了末尾位置。

本题解题技巧

本题巧妙的地方就在于把当前位置最大可以到的下标记录下来,

注意我们不要纠结当前位置该跳跃几步,而是判断当前位置是否可以到达,并且当前位置可以继续往前跳。如果这两个条件都满足,我们就一直往前跳,直到到达末尾位置。

编码解决

java 复制代码
class Solution {
    public boolean canJump(int[] nums) {
      // write code here
      int reach = 0; // 目前最远能跳到的点
      for (int i = 0; i < nums.length; i++) {
        // 之前的点都跳不到当前的点,所以失败
        if (reach < i) return false;
        // 已经能跳到最后一个点了,直接返回
        if (reach >= nums.length-1) return true;
        // 如果通过当前的点能够到更远的点,更新reach
        reach = Math.max(reach, i + nums[i]);
      }
        
      return true;
    
    }
}

总结

相比第45题跳跃游戏II, 本题更好理解,我们只要想到判断每个位置是否可以继续往下跳的思路,就可以解决此题。

相关推荐
子兮曰5 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰5 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
倒头就睡的小比特5 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!5 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
爱勇宝5 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
胡写代码5 天前
别再前后端各写一套表单校验了
java·后端
晨米酱5 天前
AGENTS.md:Agent 的上下文策略层
面试·架构·agent
大勇前进5 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端
猎头南楼5 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
yuzhi_liu5 天前
我用 LangGraph4j 实现 Multi-Agent Supervisor
后端