lotus

贵有恒何必三更眠五更起 最无益只怕一日曝十日寒

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  1846 随笔 :: 0 文章 :: 109 评论 :: 288万 阅读

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. 总结

posted on   白露~  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示