当前位置: 首页 > article >正文

力扣第 55 题 跳跃游戏

力扣第 55 题 跳跃游戏(Jump Game)。题目要求判断一个非负整数数组中,是否能够从第一个位置跳跃到最后一个位置。每个元素表示从当前位置最多可以跳跃的步数。

解题思路

我们可以用 贪心算法 来解决这个问题。贪心的核心思想是始终维护当前能够到达的最远位置,并判断是否可以覆盖到数组的最后一个位置。

  1. 初始化变量 maxReach 为 0,表示当前能够跳到的最远位置。
  2. 遍历数组的每个位置 i,判断:
    • 如果当前下标 i 大于 maxReach,说明无法从前面的跳跃到达位置 i,返回 false
    • 更新 maxReachmax(maxReach, i + nums[i]),表示当前能够跳到的最远位置。
  3. 如果遍历结束后,maxReach 大于等于数组的最后一个下标,则返回 true

C语言实现

#include <stdio.h>
#include <stdbool.h>

// 跳跃游戏判断函数
bool canJump(int* nums, int numsSize) {
    int maxReach = 0;  // 能到达的最远位置

    for (int i = 0; i < numsSize; i++) {
        // 如果当前位置超过能到达的最远位置,说明无法继续跳跃
        if (i > maxReach) {
            return false;
        }
        // 更新能到达的最远位置
        if (i + nums[i] > maxReach) {
            maxReach = i + nums[i];
        }
        // 如果最远位置已经可以覆盖最后一个位置,则直接返回 true
        if (maxReach >= numsSize - 1) {
            return true;
        }
    }

    return false;
}

int main() {
    int nums[] = {2, 3, 1, 1, 4};
    int numsSize = sizeof(nums) / sizeof(nums[0]);

    if (canJump(nums, numsSize)) {
        printf("可以跳到最后一个位置!\n");
    } else {
        printf("无法跳到最后一个位置!\n");
    }

    return 0;
}

示例解析

示例 1:

输入:

int nums[] = {2, 3, 1, 1, 4};

输出:

可以跳到最后一个位置!

解释:

  • 从第一个位置跳跃 2 步到索引 1,接着跳跃 3 步到最后一个位置。
示例 2:

输入:

int nums[] = {3, 2, 1, 0, 4};

输出:

无法跳到最后一个位置!

解释:

  • 无论怎么跳跃,都无法跳过索引 3 的位置,因为索引 3 的值为 0。

复杂度分析

  1. 时间复杂度 O ( n ) O(n) O(n)
    • 遍历数组中的每个元素一次,线性时间复杂度。
  2. 空间复杂度 O ( 1 ) O(1) O(1)
    • 只使用了一个变量 maxReach,空间复杂度为常数。

贪心算法的核心

贪心的本质是:

  • 只关心是否能到达尽可能远的位置,而不需要模拟实际的跳跃过程。
  • 一旦 maxReach 无法覆盖某个位置,直接返回 false;如果能够覆盖到最后一个位置,返回 true

http://www.kler.cn/a/399441.html

相关文章:

  • 实用教程:如何无损修改MP4视频时长
  • Python中的正则表达式教程
  • nuget 管理全局包、缓存和临时文件夹
  • Mac 电池没电关机导致时间不同步
  • 使用视频提升应用在 App Store 中的推广效果
  • 低代码平台:跨数据库处理的重要性与实现方式
  • 大语言模型通用能力排行榜(2024年11月8日更新)
  • 项目技术栈-解决方案-注册中心
  • JavaSE常用API-日期(计算两个日期时间差-高考倒计时)
  • Android 删除设置的WLAN偏好选项菜单,即设置不可见
  • 【PHP】ThinkPHP基础
  • [NSSCTF Round#16 Basic]了解过PHP特性吗 详细题解
  • web前端开发网页--css样式的使用
  • Prometheus面试内容整理-场景应用和故障排查
  • Flutter开发之flutter_local_notifications
  • 2024年了,TCP分析工具有哪些?
  • 力扣-Hot100-链表其一【算法学习day.34】
  • websocket身份验证
  • 网络技术-定义配置ACL规则的语法和命令
  • 学了Arcgis的水文分析——捕捉倾泻点,河流提取与河网分级,3D图层转要素失败的解决方法,测量学综合实习网站存着
  • htm + vue + quill 富文本编辑器案例
  • ubuntu连接orangepi-zero-2w桌面的几种方法
  • 【逐行注释】三维容积卡尔曼滤波(CKF)的MATLAB例程,附下载链接
  • 探秘Spring Boot中的@Conditional注解
  • 千帆启航,人才先行 | 讯方技术HarmonyOS人才训练营
  • 基于springboot家教管理系统源码和论文