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, 本题更好理解,我们只要想到判断每个位置是否可以继续往下跳的思路,就可以解决此题。

相关推荐
nnerddboy16 小时前
Rust教程04:引用、借用与切片
开发语言·后端·rust
Rain的Java大神之路16 小时前
线上接口负载满了如何解决
java·数据库·redis·后端·缓存·面试·架构
Dr.kangder16 小时前
嵌入式面试总结(十八)——JTAG调试
嵌入式硬件·面试·职场和发展·架构·嵌入式
m0_5474866617 小时前
《数据结构与算法》全套PPT课件2026(中国海洋大学)
数据结构·算法
旖旎夜光17 小时前
LeetCode 904:水果成篮(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
weixin_4316004417 小时前
NestJS 入门(7):生命周期钩子——构造函数和 `OnModuleInit` 差在哪?
前端·后端·学习·node.js·nest.js
小强库计算机毕业设计17 小时前
基于 Spring Boot + Vue3 的校园管理系统
java·spring boot·后端·项目实战·管理系统·技术分享·校园管理系统实战
怪奇云呼军18 小时前
G.711、Opus 和重采样会拖慢识别吗?闪电智能VoiceAgent 的音频入口怎么选
java·人工智能·python·算法·云计算·音视频
canonical_entropy18 小时前
关于《Mission Driver:Loop Engineering 的一种通用参考实现》的补充说明
后端·agent·ai编程
__zRainy__18 小时前
Node系列 · Node基础:Node.js 概述
后端·node.js