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

【Leetcode刷题记录】45. 跳跃游戏 II--贪心算法

45. 跳跃游戏 II

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

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

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

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

先分析题目给的第一个例子

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

从起点开始i=0,nums[i]=2,可以跳到i=1或i=2的位置。

  • 如果跳到i=1处,由于nums[i]=3那么接下来最远可以跳到i=4处。
  • 如果跳到i=2处,由于nums[i]=1,那么接下来最远可以跳到i=3处。

显然,我们要跳到i=1处,接着跳到i=4处,此时到达终点。在每一步中我们都尝试找到能让我们跳得最远的位置,从而确保在最少的跳跃次数内到达数组的最后一个位置。

那么这道题的贪心策略可以这样描述:

在任意一个起始点i上,我们不仅要考虑从该点可以直接跳跃的最大长度(nums[i]),还要考虑在这个范围内所有可能的下一步跳跃位置,并从中选择一个使得我们能够到达最远距离的位置进行跳跃。也就是 i + j + n u m s [ i + j ] , 其中 1 < = j < = n u m s [ i ] i+j+nums[i+j],其中1<=j<=nums[i] i+j+nums[i+j],其中1<=j<=nums[i]的最大值。

代码

int jump(vector<int>& nums) {
    int time = 0;
    int n = nums.size(), i = 0;
    while (i < n - 1) {
        if (i + nums[i] >= n - 1) {
            time++;
            break;
        }
        int max = 0, maxIndex = 0;
        for (int j = 1; j <= nums[i]; j++) {
            if (i + j + nums[i + j] > max) {
                max = i + j + nums[i + j];
                maxIndex = i + j;
            }
        }
        i = maxIndex;
        time++;
    }
    return time;
}

除此之外还有一种贪心解法,我们的目标是到达数组最后一个位置,因此我们可以考虑最后一步跳跃前所在的位置,从起点往终点开始搜索,显然会出现有多个位置都可以跳跃到数组的最后一个位置的情况,那么我们选取距离最远的那个位置,找到一次跳跃前的位置后,继续按照这样的步骤,一直找到开始位置为止。

代码

int jump(vector<int>& nums) {
    int time=0;
    int position=nums.size()-1;
    while(position>0){
        for(int i=0;i<position;i++){
            if(i+nums[i]>=position){
                time++;
                position=i;
                break;
            }
        }
    }
    return time;
}

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

相关文章:

  • Android车机DIY开发之学习篇(七)NDK交叉工具构建
  • PostgreSQL 数据备份与恢复:掌握 pg_dump 和 pg_restore 的最佳实践
  • 基于特征工程与转换方法的LightGBM资产预测研究
  • 【QT】- QUdpSocket
  • [c语言日寄]越界访问:意外的死循环
  • 如何解决跨浏览器兼容性问题
  • 【算法】经典博弈论问题——斐波那契博弈 + Zeckendorf 定理 python
  • 中文输入法方案
  • CH32V303RCT6使用RTOS的选择对比
  • 深入理解 C 语言函数指针的高级用法:(void (*) (void *)) _IO_funlockfile
  • 对游戏宣发的粗浅思考
  • LabVIEW开发故障诊断
  • 虚幻基础06:cast to
  • 讲解QoS队列调度算法
  • 【算法应用】基于A*-蚁群算法求解无人机城市多任务点配送路径问题
  • 用HTML、CSS和JavaScript实现庆祝2025蛇年大吉(附源码)
  • A星算法两元障碍物矩阵转化为rrt算法四元障碍物矩阵
  • SIPp的使用-SIPp的教程
  • INCOSE需求编写指南-第4节:需求和要求陈述以及需求和要求集的规则
  • 【Leetcode 每日一题】119. 杨辉三角 II
  • 06_改善播放效果--优先级与阻塞
  • Java定时任务实现方案(五)——时间轮
  • C++基础(1)
  • 处理 .gitignore 未忽略文件夹问题
  • 我的2024年终总结和2025年展望
  • DeepseekMath:超强开源数学模型(论文详解)