贪心算法——最少跳跃步数(C++)

devtools/2024/12/22 23:13:50/

未来,未来。

——2024年6月17日


题目描述

        给定一个含n(1≤n≤1000)个非负整数数组nums(0≤nums[i]≤1000),数组中的每个元素表示在该位置可以跳跃的最大长度,假设总是可以从初始位置0到达最后一个位置n-1,设计一个算法求最少的跳跃次数。

        例如nums={2,3,1,1,4},n=5,从位置0可以跳一步到达位置1,再从位置1跳3步到位置4,所以结果为2。

题解思路

        贪心法

1. 当n=1时,不需要跳跃,跳跃步数为0;

2. 当n>1时,用steps表示跳跃步数;

错误思路:

  • 在i=0时会跳出第一步,那它能达到最远的位置就是end=i+nums[i],那是不是说每次都跳跃最远的距离(即nums[i])就能跳跃最少的步数呢?答案是否定的,那题目的例子来说:
  • 此时nums[0]=2,能跳跃的最远距离是2,能达到的最远位置是0+nums[0]=2,到达2号位;
  • 此时nums[2]=1,能跳跃的最远距离就是1,能达到的最远位置是2+nums[2]=3,到达3号位;
  • 此时nums[3]=1,能跳跃的最远距离就是1,能达到的最远位置是3+nums[3]=4,到达4号位;
  • 可以看到一共跳跃了3步,而它明明只需要两步就能到达最后的位置。

正确思路:多考虑一步,既要考虑当前跳跃能达到的最远位置,还需要考虑从i到最远位置之间的nums[k](k∈[i, i+nums[i]])能达到的最远位置k+nums[k],即使它最终超过了nums.size()-1。

再举个例子

当前nums[] = {2,1,3,2,2,1,4} ,pos的位置变化从0→2→4→末尾(甚至超过末尾),只需要三步即可。 


注:可以好好体会一下这个思路,考试周结束我会继续完善这篇博客。

代码实现

// 提前向前看两个位置, 找到最远跳跃距离
int minStep(vector<int> &num){int len = num.size();int ans = 0;if(len == 1){return 0;}for(int i = 0; i < len; ){int maxstep1 = i + num[i];//记录当前能达到的最远位置int maxstep2;int max = 0;int pos = 0;for(int j = i + 1; j <= i + num[i] && j < len; j++){//在该区间中找第二个能达到的最远位置对应的jmaxstep2 = j + num[j];//记录j能达到的最远位置if(maxstep2 > max){max = maxstep2;pos = j;}if(maxstep2 >= len - 1){break;//如果已经超过len-1,说明已经能跳出最后一个位置了,那么就不需要找j了}}cout<<"从"<<i<<"位置跳跃到"<<pos<<"位置"<<endl;ans++;if(maxstep2 >= len - 1){cout<<"从"<<pos<<"位置跳跃到末尾"<<endl;ans++;break;}i = pos;//更新i作为下一次的起点}return ans;
}

代码简化

int minStep(vector<int> &v){int len = v.size();int maxDistance = 0;int end = 0;int steps = 0;// 最后一个位置不需要向前跳跃了哦for(int i = 0; i < len - 1; i++){maxDistance = max(maxDistance, v[i] + i);if(i == end){//说明能走到最远的位置,那么后面仍然有数字end = maxDistance;steps++;}}return steps;
}

运行结果


http://www.ppmy.cn/devtools/55205.html

相关文章

数据库的概念-数据库、数据库管理系统、数据库系统、数据库管理员、数据库设计人员、开发管理使用数据库系统的人员

一、数据库&#xff08;DB&#xff09; 1、数据库就是存储数据的仓库&#xff0c;只不过这个仓库是在计算机存储设备上 2、严格的说&#xff0c;数据库是长期存储在计算机内、有组织的、统一管理的、可共享的相关数据的集合 3、数据库应是为一个特定目标而设计、构建并装入数…

物联网系统运维——数据库部署

一.MySQL 1.概要 MySQL是一种关联数据库管理系统&#xff0c;关联数据:而不是将所有数据放在一个大仓库内&#xff0c;这样就增加了速度并提高了灵活性库将数据保存在不同的表中。性能高、成本低、可靠性好&#xff0c;已经成为最流行的开源数据库。 二.MySQL安装与配置 1. …

人工智能和机器学习的应用日益广泛,在医疗健康领域的具体应用是什么?

人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;在医疗健康领域的应用日益广泛&#xff0c;涵盖了从疾病预测、辅助诊断、药物研发到健康管理等多个方面。以下是一些具体的应用实例和成功案例&#xff1a; 疾病预测与辅助诊断&#xff1a;机器学习算…

网络安全,怎么搭建Python防范环境

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程: Python网络安全项目开发实战_搭建Python防范环境_编程案例解析实例详解课程教程.pdf 构建一个Python环境下的网络安全防范体系是一个涉及多个层面和步…

PostgreSQL源码分析——审计插件pgaudit

PostgreSQL审计插件pgaudit 在PostgreSQL中&#xff0c;提供了开源的审计插件pgaudit&#xff0c;但是其功能并不完善&#xff0c;只提供了基本的审计功能&#xff0c;对此&#xff0c;很多基于PG开发的商业数据库大多提供了丰富的审计功能。比如人大金仓&#xff0c;openGaus…

2.华为配置静态路由

通过配置静态路由让PC1和PC2互通 AR1 [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 192.168.1.254 24 [Huawei]int g0/0/1 [Huawei-GigabitEthernet0/0/1]ip add 1.1.1.1 24 [Huawei]ip route-static 192.168.2.0 24 1.1.1.2AR2 [Huawei]int g0/0/0 [Huawei-Gig…

ESP-IDF OTA机制详解(9)

接前一篇文章&#xff1a;ESP-IDF OTA机制详解&#xff08;8&#xff09; 上一回开始对于乐鑫官网例程中OTA代码主要流程中的核心部分——esp_https_ota_perform函数进行解析&#xff0c;讲解了函数的前两段内容。本回继续往下进行解析。为了便于理解和回顾&#xff0c;再次贴出…

gitlab 获取指定分支下指定路径文件夹的解决方案

第一步&#xff1a; 获取 accessToken 及你的 项目 id &#xff1a; 获取 accessToken ,点击用户头像进入setting 按图示操作&#xff0c;第 3 步 填写你发起请求的域名。 获取项目 id , 简单粗暴方案 进入 你项目仓库页面后 直接 源码搜索 project_id&#xff0c; value 就…