1. 题目
https://leetcode.cn/problems/jump-game/
考察点
这道题的考察点是数组和动态规划。
数组是一种基本的数据结构,需要掌握如何遍历、访问和修改数组中的元素。
动态规划是一种常用的算法思想,需要掌握如何找到问题的最优子结构、状态转移方程和边界条件。
这道题可以用动态规划来解决,也可以用贪心算法来优化时间复杂度。
2. 解法
思路
这个问题的思路是从后往前遍历数组,
- 维护一个变量lastIndex表示能够到达最后一个位置的最小索引。
- 如果当前位置i加上nums[i]大于等于lastIndex,
- 说明从i位置可以跳到lastIndex,那么更新lastIndex为i。
- 最后判断lastIndex是否为0,如果是,说明可以从第一个位置跳到最后一个位置,返回true;否则返回false。
具体实现
这个解法属于贪心算法,因为它每次选择能够跳到最远的位置,而不考虑其他的可能性。贪心算法的优点是简单高效,缺点是不一定能得到全局最优解,需要证明贪心策略的正确性。
1 2 3 4 5 6 7 8 9 10 11 | class Solution { public boolean canJump( int [] nums) { int lastIndex = nums.length - 1 ; // 最后一个位置 for ( int i = nums.length - 2 ; i >= 0 ; i--) { // 从后往前遍历 if (i + nums[i] >= lastIndex) { // 如果当前位置可以跳到lastIndex lastIndex = i; // 更新lastIndex为当前位置 } } return lastIndex == 0 ; // 判断是否可以从第一个位置跳到最后一个位置 } } |
另一种写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class JumpGame { public boolean canJump( int [] nums) { int maxLength = 0 ; for ( int i = 0 ; i < nums.length ; i++) { if (maxLength >= nums.length - 1 ) { return true ; } if (maxLength < i) { return false ; } maxLength = Math.max(nums[i] + i, maxLength); } return false ; } } |
3. 总结
分类:
算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)