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

LeetCode45:跳跃游戏II

原题地址:45. 跳跃游戏 II - 力扣(LeetCode)

题目描述

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

  • 0 <= j <= nums[i] 
  • i + j < n

返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]

示例 1:

输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是2。从下标为 0 跳到下标为 1 的位置,跳 1步,然后跳 3步到达数组的最后一个位置。

示例 2:

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

解题思路

  1. 问题描述
    给定一个数组 nums,其中每个元素表示可以跳跃的最大步数,目标是从数组的第一个位置跳到最后一个位置,求出最少的跳跃次数。

  2. 贪心算法思想

    • 从后往前思考,目标是找到从最后一个位置可以跳到的位置,逐步回溯到起点。
    • 每次遍历数组,寻找一个可以直接跳到当前位置的最远索引,并将其作为新的目标。
    • 每找到一个新的目标索引,步数 (steps) 增加一次,直到目标索引回溯到起点。

源码实现

class Solution {
    public int jump(int[] nums) {
        // 初始化目标位置为最后一个索引
        int position = nums.length - 1;
        // 初始化跳跃次数
        int steps = 0;

        // 当目标位置还未回到起点时,继续寻找跳跃路径
        while (position > 0) {
            // 从起点到当前位置遍历,寻找一个能跳到目标位置的索引
            for (int i = 0; i < position; i++) {
                // 如果索引 i 能跳到目标位置
                if (i + nums[i] >= position) {
                    // 将目标位置更新为索引 i
                    position = i;
                    // 增加一次跳跃次数
                    steps++;
                    // 找到后立即退出内层循环,进行下一步回溯
                    break;
                }
            }
        }
        // 返回跳跃的总次数
        return steps;
    }
}

复杂度分析

  1. 时间复杂度:

    • 外层循环的次数等于最终的跳跃次数(steps),最坏情况下为 O(n)
    • 内层循环每次遍历目标位置之前的所有索引,最坏情况下为 O(n)
      因此,时间复杂度为 O(n^2)
  2. 空间复杂度:

    • 该算法只使用了常数个变量(position 和 steps),没有额外的空间开销。
      空间复杂度为 O(1)

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

相关文章:

  • OpenCV相机标定与3D重建(63)校正图像的畸变函数undistort()的使用
  • vulnhub靶场【IA系列】之Tornado
  • 前瞻2024:前沿技术的全景洞察与深度剖析
  • AT8870单通道直流电机驱动芯片
  • 计算机创造的奇迹——C语言
  • Python+ tkinter实现小学整数乘法和除法竖式演算式
  • 【CSS in Depth 2 精译_067】11.2 颜色的定义(中):CSS 中的色域与色彩空间
  • C# GDI绘制的倒计时控件
  • 数组 - 八皇后 - 困难
  • 模拟IC设计中LDO的学习笔记(一)
  • 【C#】NET 9中LINQ的新特性-CountBy
  • 【Pandas】pandas wide_to_long
  • AWS Kinesis Firehose 权限配置完全指南
  • BERT模型的输出格式探究以及提取出BERT 模型的CLS表示,last_hidden_state[:, 0, :]用于提取每个句子的CLS向量表示
  • DSA 和 ECDSA 签名算法
  • 调用matlab用户自定义的function函数时,有多个输出变量只输出第一个变量
  • 【Linux课程学习】:站在文件系统之上理解:软硬链接,软硬链接的区别
  • 面试中遇到的一些有关进程的问题(有争议版)
  • Linux学习笔记15 何为HDD,SSD?sata?PCIE?分区,MBR,GPT分区的理解
  • STM32标准固件库官网下载方法
  • Spring Boot微服务应用实战:构建高效、可扩展的服务架构
  • 显示设备驱动开发
  • 【力扣】2094.找出3为偶数
  • 【Leetcode 每日一题】3001. 捕获黑皇后需要的最少移动次数
  • 【CSS in Depth 2 精译_066】11.2 颜色的定义(上):实现示例页中的基础样式及初步布局
  • vim实用命令整理(常用的命令)