一个数组存储了非负整型数据,数组中的第i个元素a[i],代表了可以从数组第i个 位置最多向前跳跃a[i]步;已知数组各元素的情况下,求是否可以从数组的第0个位置跳跃到数组的最后一个元素的位置,返回最少跳跃的次数以及跳跃过程的路径(以数组下标标识)

例如:
nums = [2, 3, 1, 1, 4] ,可以从nums[0] = 2 跳跃至 nums[4] = 4; 最少跳跃次数为2,跳跃路径为[0,1,4]

该跳跃过程和判断最终节点是否可达类似,不过需要注意一点:为了保证获取到的跳跃次数是最少的,需要在每一次的跳跃范围中尽可能得跳跃更多的节点,且在第一次跳跃结束后获取到后续所有节点的跳跃范围之后再进行下一次跳跃。

贪心规律:
在无法到达更远的地方时,在这之前应该跳到一个可以到达更 远位置的位置!


类似如上,在index[i]的节点上无法跳跃到更远的节点了,此时应该选择index[i-2],使得其能够跳跃更远的节点。

同时如果想要获取跳跃的路径,即可将跳跃过程中发生的节点更替的时的下标记录下来,在跳跃的过程中加入到路径数组即可。

实现过程如下:

/*获取最少的跳跃次数*/
int get_judge_finish(vector<int> &stage) {if (stage.size() < 2) {return 0;}int current_max_pos = stage[0]; //当前能够跳跃到的最远的节点int pre_max_pos = stage[0];    //各个位置能够跳跃到的最远的节点int least_jum = 1;for (int i = 0;i < stage.size(); ++i) {if(i > current_max_pos) { //当遍历完当前节点当范围时进行跳跃,跳跃点选择各个位置能够跳跃当最远的点least_jum ++;current_max_pos = pre_max_pos;}if (pre_max_pos < stage[i] + i){ //获取各个位置能够跳跃到的最远的点pre_max_pos = stage[i] + i;}}return least_jum;
}/*获取最少的跳跃路径*/
vector<int> get_jump_path(vector<int> &stage) {if (stage.size() < 2) {return stage;}int current_max_pos = stage[0];int pre_max_pos = stage[0];int pre_max_index = 0; //记录各个位置能够跳的最远的节点下标vector<int> jump_path; //记录跳跃路径jump_path.push_back(0); //开头节点起跳for (int i = 0;i < stage.size(); ++i) {if(i > current_max_pos) {current_max_pos = pre_max_pos;/*当开始跳时,记录的各个位置能够跳的最远的下标*/jump_path.push_back(pre_max_index); }   if (pre_max_pos < stage[i] + i){pre_max_pos = stage[i] + i;pre_max_index = i;}}jump_path.push_back(stage.size()-1);return jump_path;
}

测试代码如下:

#include <iostream>
#include <vector>using namespace std;
/*判断是否能够完成跳跃*/
bool judge_finish(vector<int> &stage) {vector<int> index;for (int i = 0; i < stage.size(); ++i) {index.push_back(i + stage[i]);}int max_index = stage[0];int jump = 0;while(jump < index.size() && jump <= max_index) {if (max_index < index[jump]) {max_index = index[jump];}jump ++;}if (jump == index.size()) {return true;}return false;
}
/*获取最少的跳跃次数*/
int get_judge_finish(vector<int> &stage) {if (stage.size() < 2) {return 0;}int current_max_pos = stage[0];int pre_max_pos = stage[0];int least_jum = 1;for (int i = 0;i < stage.size(); ++i) {if(i > current_max_pos) {least_jum ++;current_max_pos = pre_max_pos;}if (pre_max_pos < stage[i] + i){pre_max_pos = stage[i] + i;}}return least_jum;
}
/*获取跳跃路径*/
vector<int> get_jump_path(vector<int> &stage) {if (stage.size() < 2) {return stage;}int current_max_pos = stage[0];int pre_max_pos = stage[0];int pre_max_index = 0;vector<int> jump_path;jump_path.push_back(0);for (int i = 0;i < stage.size(); ++i) {if(i > current_max_pos) {current_max_pos = pre_max_pos;jump_path.push_back(pre_max_index);}   if (pre_max_pos < stage[i] + i){pre_max_pos = stage[i] + i;pre_max_index = i;}}jump_path.push_back(stage.size()-1);return jump_path;
}int main() {vector<int> s;int tmp;cout << "input arr " <<endl;for (int i =0;i < 5; ++i) {cin >> tmp;s.push_back(tmp);}cout << "the least times to jump is " << get_judge_finish(s) << endl;cout << "the true or false that judge the result is " << judge_finish(s) << endl;cout << "jump path is " << endl;vector<int> path = get_jump_path(s);for (int i = 0;i < path.size(); ++i) {cout << path[i] << " ";}return 0;
}

输出如下:

input arr
3 2 2 0 5
the least times to jump is 2
the true or false that judge the result is 1
jump path is
0 2 4input arr
2 3 1 1 4
the least times to jump is 2
the true or false that judge the result is 1
jump path is
0 1 4

贪心:jump 游戏(获取最少跳跃的次数以及跳跃路径)相关推荐

  1. Leetcode1703. 得到连续 K 个 1 的最少相邻交换次数[C++题解]:难(货仓选址加强版+滑动窗口+前缀和)

    文章目录 题目分析 题目链接 题目分析 首先需要明确一点:最优结果中1的相对位置和开始时不会改变.否则的话就是交换两个1,会徒劳增加交换次数. 比如[1,0,0,0,0,0,1,1],最后变成[0,0 ...

  2. LeetCode 6033. 转换数字的最少位翻转次数(位运算)

    文章目录 1. 题目 2. 解题 1. 题目 一次 位翻转 定义为将数字 x 二进制中的一个位进行 翻转 操作,即将 0 变成 1 ,或者将 1 变成 0 . 比方说,x = 7 ,二进制表示为 11 ...

  3. LeetCode 1824. 最少侧跳次数(DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个长度为 n 的 3 跑道道路 ,它总共包含 n + 1 个 点 ,编号为 0 到 n . 一只青蛙从 0 号点第二条跑道 出发 ,它想要跳到点 n ...

  4. jQuery 遍历:思路总结,项目场景中如何处理/控制获取的 each 遍历次数?

    文章目录 前言 一.项目场景分析 二.实体类定义描述(仅关键代码) 2.1.实体类定义描述 2.2.逻辑处理与分析 2.3.遍历数据如何修改的问题暴露 三.处理思路 3.1.源码分析 jQuery 中 ...

  5. python 字符串去重且相同字符最多出现2次_【Python】获取字符串中出现次数最多/少的字符...

    本节主要实现以下目标: 1.实现Python获取字符串中出现次数最多/少的字符: 2.存在问题分析与处理: 代码说明: 1.max() 方法返回给定参数的最大值,参数可以为序列.详细参考菜鸟教程. 2 ...

  6. 前端 JavaScript 获取字符串中重复次数最多的字符

    问渠那得清如许,为有源头活水来. 想要保持自己的技术活力,最有效的手段就是通过不断地输入来提供足够的养分.我们也不必刻意追求高深的或者新鲜的知识点,通过对一个基础问题的全方位多维度解析,同样也会收获不 ...

  7. 2379. 得到 K 个黑块的最少涂色次数

    2379. 得到 K 个黑块的最少涂色次数 给你一个长度为 n 下标从 0 开始的字符串 blocks ,blocks[i] 要么是 'W' 要么是 'B' ,表示第 i 块的颜色.字符 'W' 和 ...

  8. 得到 K 个黑块的最少涂色次数

    leetcode 2379. 得到 K 个黑块的最少涂色次数 给你一个长度为 n 下标从 0 开始的字符串 blocks ,blocks[i] 要么是 'W' 要么是 'B' ,表示第 i 块的颜色. ...

  9. LeetCode——1824. 最少侧跳次数(Minimum Sideway Jumps)[中等]——分析及代码(Java)

    LeetCode--1824. 最少侧跳次数[Minimum Sideway Jumps][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划(二维数组) (1)思路 (2)代 ...

最新文章

  1. 力扣:169. 多数元素
  2. 从零实现SpringBoot简易读写分离,也不难嘛!
  3. calender get方法_Calendar.get()方法--- WEEK_OF_YEAR 、MONTH、
  4. 2020-05-06 ethtool源代码学习步骤
  5. python入门经典100题-Python3基础训练经典100题(带答案)下载
  6. docker用gpu的参数_Docker化部署(GPU)
  7. mysql创建新用户并设置密码时报错:Your password does not satisfy the current policy requirements
  8. 测试服务器带宽的几种常用方法
  9. Java学习-Thread
  10. 互联网行业的HR怎么看待30岁以上的基础岗位求职者
  11. 云信IM服务端API调用(THINKPHP版)
  12. Failed to create pod sandbox: rpc error: code = Unknown desc = [failed to set up sandbox container..
  13. Android APP头像的图标与背景的设置
  14. 鸿蒙系统入门开发(入门篇)
  15. 2021高考成绩位次查询6,江西高考排名对应学校-江西高考位次查询(2021年文科参考)...
  16. c语言程序设计拉丁方阵结构图,C语言程序设计100例之(29):拉丁方阵
  17. JS实现网页流氓广告效果
  18. java jdbc 无效的列名_java.sql.SQLException列名无效
  19. 成品油公司注册之柴油的馏程和特性
  20. ubuntu鼠标灵敏度、加速度修改

热门文章

  1. 计算机艺术未来发展趋势,计算机技术对现代艺术设计的影响
  2. usaco Network of Schools
  3. usaco wormhole(看了官方视频题解)
  4. qteewidgetitem添加子节点_行为树的节点
  5. 信息技术计算机网络PPT,高中信息技术计算机网络ppt课件.ppt
  6. 华为鸿蒙运行视频,某游戏在华为鸿蒙运行,被识别成使用安卓模拟器
  7. java link 使用_使用 C 实现Java LinkList
  8. C++在堆区创建数组
  9. PyTorch框架:(4)如何去构建数据
  10. PCL:点云配准1、基础知识:平面3自由度、旋转矩阵精讲