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

相关推荐
南宫生32 分钟前
力扣每日一题【算法学习day.130】
java·学习·算法·leetcode
柠石榴33 分钟前
【练习】【类似于子集问题】力扣491. 非递减子序列/递增子序列
c++·算法·leetcode·回溯
!!!52541 分钟前
Java实现斗地主-做牌以及对牌排序
java·算法
sjsjs111 小时前
【数据结构-并查集】力扣1722. 执行交换操作后的最小汉明距离
数据结构·算法·leetcode
过客猫20221 小时前
使用 deepseek实现 go语言,读取文本文件的功能,要求支持 ascii,utf-8 等多种格式自适应
开发语言·后端·golang
刘立军1 小时前
本地大模型编程实战(20)用langgraph和智能体实现RAG(Retrieval Augmented Generation,检索增强生成)(4)
人工智能·后端·llm
CoderIsArt1 小时前
生成一个立方体贴图(Cube Map)
算法·sharpgl
且听风吟ayan1 小时前
leetcode day20 滑动窗口209+904
算法·leetcode·c#
m0_675988231 小时前
Leetcode350:两个数组的交集 II
算法·leetcode·数组·哈希表·python3
_Itachi__1 小时前
LeetCode 热题 100 160. 相交链表
算法·leetcode·链表