Leetcode算法训练日记 | day33

专题九  贪心算法

一、跳跃游戏

1.题目

Leetcode:第 55 题

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

示例 1:

输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。

示例 2:

输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。

2.解题思路

使用贪心算法解决跳跃游戏问题。

canJump 函数中,我们首先检查数组 nums 的大小,如果只有一个元素,那么无需跳跃即可到达,直接返回 true。我们使用变量 cover 来记录从数组起点开始能够到达的最远位置。然后,我们使用一个 for 循环来尝试从每个位置进行跳跃。在每次迭代中,我们计算以当前位置 i 为起点能够达到的新的最大覆盖距离 cover,这是当前位置 i 加上从该位置可跳跃的最大步数 nums[i]。如果在任何时候 cover 大于等于 nums.size() - 1,这意味着我们已经能够从起点跳到数组的终点,此时函数返回 true。如果循环结束后,cover 没有达到数组的最后一个位置,说明无法从起点跳到终点,函数返回 false。这个方法利用了贪心算法的思想,即在每一步选择中都尝试达到最远的位置,从而找到是否能够到达终点的全局解。

3.实现代码

#include <iostream>
#include <vector>
using namespace std;class Solution {
public:// canJump 函数用于判断是否可以通过跳跃从数组的开始位置到达结束位置bool canJump(vector<int>& nums) {int cover = 0; // 初始化 cover 变量,表示当前能够覆盖的最远距离if (nums.size() == 1) {return true; // 如果数组只有一个元素,可以直接返回 true,因为不需要跳跃}for (int i = 0; i <= cover; i++) {// 遍历数组,i 表示当前跳跃的起始位置cover = max(i + nums[i], cover);// 更新 cover 为当前位置加上可跳跃的最远距离,与当前 cover 的最大值if (cover >= nums.size() - 1) {// 如果更新后的 cover 达到了或超过了数组的最后一个位置return true;// 说明可以从开始位置跳到最后一个位置,返回 true}}return false; // 如果在遍历结束后,无法覆盖到数组的最后一个位置,则返回 false}
};//测试
int main()
{Solution p;vector<int> nums = { 2,3,1,1,4 };int result = p.canJump(nums);cout << "nums数组是否能够到达最后一个下标:" << result << endl;cout << endl;return 0;
}

 

 

二、跳跃游戏Ⅱ

1.题目

Leetcode:第 45 题

给定一个长度为 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
2.解题思路

使用贪心算法解决跳跃游戏问题。

jump 函数中,我们首先检查数组 nums 的大小,如果只有一个元素,那么不需要跳跃,直接返回 0。我们使用变量 curDistance 来记录当前能够到达的最远位置,ans 来记录总的跳跃次数,nextDistance 来记录下一次跳跃能够到达的最远位置。循环遍历数组,我们使用 max 函数来更新 nextDistance,这是当前位置加上可跳跃的最大步数 nums[i] 的结果,与之前计算的nextDistance 的最大值。当 i 等于 curDistance 时,意味着我们到达了上一次跳跃的最远位置,因此我们需要进行下一次跳跃。此时,我们增加 ans,并将 curDistance 更新为 nextDistance。如果在任何时候 nextDistance 大于等于 nums.size() - 1,这意味着我们可以从当前位置跳到数组的末尾,因此我们结束循环。最终,函数返回 ans,即到达数组末尾所需的最小跳跃次数。这个方法利用了贪心算法的思想,即在每一步选择中都尝试达到最远的位置,从而最小化总的跳跃次数。

3.实现代码
#include <iostream>
#include <vector>
using namespace std;class Solution {
public:int jump(vector<int>& nums) {if (nums.size() == 1) return 0;int curDistance = 0;int ans = 0;int nextDistance = 0;for (int i = 0; i < nums.size(); i++) {nextDistance = max(nums[i] + i, nextDistance);if (i == curDistance) {ans++;curDistance = nextDistance;if (nextDistance >= nums.size() - 1) break;}}return ans;}
};//测试
int main()
{Solution p;vector<int> nums = { 2,3,1,1,4 };int result = p.jump(nums);cout << "nums数组到达最后一个下标的最小跳跃次数:" << result << endl;cout << endl;return 0;
}

 

ps:以上皆是本人在探索算法旅途中的浅薄见解,诚挚地希望得到各位的宝贵意见与悉心指导,若有不足或谬误之处,还请多多指教。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/636980.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

成为程序员后我明白了什么?分享11条经验助你成功

文章目录 前言自我分析做什么挑战路线图总结 前言 入行15载&#xff0c;从一线大头兵&#xff0c;到负责技术的架构师&#xff0c;再到技术和管理一把抓的团队负责人&#xff0c;我从中总结了软件工程师成功入门的11个步骤&#xff0c;分享给想入行&#xff0c;或刚入行的同学们…

TCP/IP协议—MQTT

TCP/IP协议—MQTT MQTT协议MQTT协议特点MQTT通信流程MQTT协议概念 MQTT报文固定报头可变报头有效载荷 MQTT协议 消息队列遥测传输&#xff08;Message Queuing Telemetry Transport&#xff0c;MQTT&#xff09;是一个基于客户端-服务器的消息发布/订阅传输协议。它的设计思想…

2.Vue简介

Vue简介 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0c;V…

5.SpringBoot 配置文件

文章目录 1.配置文件作用2.配置文件格式2.1项目中同时存在两种配置文件2.2application.properties2.2.1 application.properties语法格式2.2.2获取自定义配置项 2.3 application.yml2.3.1 application.yml语法格式2.3.1.1单双引号区别2.3.1.2和application.properties格式对比&…

在Postgres中,如何有效地管理大型数据库的大小和增长

文章目录 一、定期清理和维护1. VACUUM和ANALYZE2. 删除旧数据和归档 二、分区表三、压缩数据四、配置优化1. 调整维护工作负载2. 监控和日志 五、使用外部存储和扩展1. 外部表和FDW2. 扩展和插件 六、定期备份和恢复测试结论 管理大型数据库的大小和增长是数据库管理员&#x…

NIMAX下载安装使用,pyvisa基本使用

NIMAX部分&#xff1a; 1、先在NI官网下载系统配置和NI-VISA&#xff1a; 系统配置&#xff1a; https://www.ni.com/zh-cn/support/downloads/drivers/download.system-configuration.html#532687https://www.ni.com/zh-cn/support/downloads/drivers/download.system-conf…

基于springboot+vue+Mysql的社区维修平台

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

C++中的继承与多态

一、继承&#xff1a; 1.什么是继承&#xff1f; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象…

记录:阿里云服务器网站搭建(2)

Docker安装Mysql mysql版本 查看开发环境中mysql版本 &#xff1a;select version()&#xff1b;安装时版本尽量保证一致&#xff0c;最低要求大版本要一致 docker 拉取mysql镜像 docker pull mysql:8.0.36 docker启动mysql容器 docker run -d \ # 创建并运行一个容器&…

【Godot4.2】太极八卦图绘制

概述 作为中国传统文化符号之一&#xff0c;太极八卦图&#xff0c;无论是哲学还是玄学&#xff0c;都不可能避开。 之前在ShapePoints函数库实现了太极的点求取函数。当时采用的时圆弧拼接的方式&#xff0c;但是存在某些尺寸下多边形无法三角化的问题。 于是就有了今天的内…

Windows使用freeSSHd搭建sftp服务器

一、安装 1、运行freeSSHd.exe&#xff08;最好以管理员方式运行&#xff09; 2、选择安装位置 3、选择全部安装 4、是否创建开始启动栏快捷入口 5、是否创建桌面快捷方式 6、安装 7、安装完成&#xff0c;点击close 8、安装私钥 9、是否要安装为服务 10、全部安装完成 二、配…

不同条件累加(C语言)

一、题目&#xff1b; 二、N-S流程图&#xff1b; 三、运行结果&#xff1b; 四、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i 0;int j 0;float result1 0;float result2 0;float result…