【力扣经典面试题】55. 跳跃游戏

简介: 【力扣经典面试题】55. 跳跃游戏

题目描述:

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false

示例 1:

输入:nums = [2,3,1,1,4]

输出:true

解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。


示例 2:

输入:nums = [3,2,1,0,4]

输出:false

解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。

题解方法:

一种贪心算法的思想,解决的问题是判断能否通过跳跃操作达到数组的最后一个元素

  1. 初始化变量: 代码中使用变量 k 来表示目前能够到达的最远的索引位置。
  2. 遍历数组: 通过一个循环遍历数组元素,其中 i 表示当前的索引位置。
  3. 判断是否能够到达: 在每一步,都检查当前索引 i 是否超出了目前能够到达的最远索引位置 k。如果超出,则说明无法到达最后一个元素,直接返回 false
  4. 更新最远可到达的位置: 如果当前索引 i 在可到达的范围内,就通过比较 ki + nums[i] 来更新能够到达的最远索引位置。这是贪心算法的核心部分,每次都选择能够跳跃最远的位置。
  5. 循环结束: 如果成功遍历整个数组,说明可以通过一系列跳跃操作到达最后一个元素,返回 true

代码:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int k = 0;  // 表示目前能够到达的最远的索引位置
        
        for(int i = 0; i < nums.size(); i++) {
            if(i > k) 
                return false;  // 如果当前索引超出了能够到达的范围,返回false
            k = max(k, i + nums[i]);  // 更新能够到达的最远的索引位置
            
            // 每一步都检查当前索引是否能够到达,根据当前索引和其值更新能够到达的最远索引。
            // 如果循环完成而没有遇到 i > k 的条件,意味着最后的索引可以到达,函数返回true。
        }
        
        return true;  // 如果成功遍历数组而没有达到终止条件,返回true
    }
};

总结:

这个算法的时间复杂度是 O(n),其中 n 是数组的长度,因为它只对数组进行一次线性遍历。这种贪心算法的思想是每次都选择能够跳跃最远的位置,以尽可能地覆盖更多的元素,从而判断是否能够到达最后一个元素。


相关文章
|
6天前
|
决策智能
集合-Nim游戏(面试hard博弈论)
集合-Nim游戏(面试hard博弈论)
|
6天前
|
Java
【LeetCode力扣】面试题 17.14. 最小K个数(top-k问题)
【LeetCode力扣】面试题 17.14. 最小K个数(top-k问题)
13 1
|
6天前
|
算法
【刷题】 leetcode 面试题 08.05.递归乘法
递归算法是一种在计算机科学和数学中广泛应用的解决问题的方法,其基本思想是利用问题的自我相似性,即将一个大问题分解为一个或多个相同或相似的小问题来解决。递归算法的核心在于函数(或过程)能够直接或间接地调用自身来求解问题的不同部分,直到达到基本情况(也称为基础案例或终止条件),这时可以直接得出答案而不必再进行递归调用。
25 4
【刷题】 leetcode 面试题 08.05.递归乘法
|
6天前
|
存储 算法 安全
【刷题】 leetcode 面试题 01.06 字符串压缩
来看效果: 非常好!!!过啦!!!
27 5
【刷题】 leetcode 面试题 01.06 字符串压缩
|
6天前
|
C++ 索引
【力扣经典面试题】14. 最长公共前缀
【力扣经典面试题】14. 最长公共前缀
|
6天前
|
C++
【力扣经典面试题】58. 最后一个单词的长度
【力扣经典面试题】58. 最后一个单词的长度
|
6天前
|
算法 Java
【力扣经典面试题】12. 整数转罗马数字
【力扣经典面试题】12. 整数转罗马数字
|
6天前
|
算法 C++
【刷题】Leetcode 1609.奇偶树
这道题是我目前做过最难的题,虽然没有一遍做出来,但是参考大佬的代码,慢慢啃的感觉的真的很好。刷题继续!!!!!!
9 0
|
6天前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
12 0