lotus

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

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1. 题目

 

 

https://leetcode.cn/problems/jump-game/

 

考察点

这道题的考察点是数组动态规划

数组是一种基本的数据结构,需要掌握如何遍历、访问和修改数组中的元素。

动态规划是一种常用的算法思想,需要掌握如何找到问题的最优子结构、状态转移方程和边界条件。

这道题可以用动态规划来解决,也可以用贪心算法来优化时间复杂度。

2. 解法

思路

这个问题的思路是从后往前遍历数组,

  • 维护一个变量lastIndex表示能够到达最后一个位置的最小索引。
  • 如果当前位置i加上nums[i]大于等于lastIndex,
  • 说明从i位置可以跳到lastIndex,那么更新lastIndex为i。
  • 最后判断lastIndex是否为0,如果是,说明可以从第一个位置跳到最后一个位置,返回true;否则返回false。

具体实现

这个解法属于贪心算法,因为它每次选择能够跳到最远的位置,而不考虑其他的可能性。贪心算法的优点是简单高效,缺点是不一定能得到全局最优解,需要证明贪心策略的正确性。

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; // 判断是否可以从第一个位置跳到最后一个位置
    }
}

  

 

另一种写法

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 2023-04-18 16:06  白露~  阅读(9)  评论(0编辑  收藏  举报