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.mzph.cn/pingmian/1314.shtml

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

相关文章

机器学习(二)之监督学习

前言&#xff1a; 上一节大概讲解了几种学习方式&#xff0c;下面几张就具体来讲讲监督学习的几种算法。 以下示例中和都是权重的意思&#xff01;&#xff01;&#xff01; 注&#xff1a;本文如有错误之处&#xff0c;还请读者指出&#xff0c;欢迎评论区探讨&#xff01; 1…

MATLAB实现图片栅格化

MATLAB实现图片栅格化 1.读取图片&#xff1a;首先&#xff0c;你需要使用imread函数读取要栅格化的图片。 2.设置栅格大小&#xff1a;确定你希望将图片划分成的栅格大小&#xff0c;即每个栅格的宽度和高度。 3.计算栅格数量&#xff1a;根据图片的总尺寸和栅格大小&#…

搜索+剪枝,LeetCode 216. 组合总和 III

目录 一、题目 1、题目描述 2、接口描述 python3 cpp 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 python3 cpp 一、题目 1、题目描述 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多…

Compose 布局

文章目录 Compose 布局ColumnColumn属性使用 RowRow属性使用 BoxBox属性使用 ConstraintLayoutLazyColumnLazyColumn属性使用使用多类型使用粘性标题回到顶部 LazyRowLazyRow属性使用 LazyVerticalGridLazyVerticalGrid属性使用 Compose 布局 Column Compose中的”垂直线性布…

F-logic DataCube3 SQL注入漏洞复现(CVE-2024-31750)

0x01 产品简介 F-logic DataCube3是一款用于光伏发电系统的紧凑型终端测量系统。 0x02 漏洞概述 F-logic DataCube3 /admin/pr_monitor/getting_index_data.php 接口处存在SQL注入漏洞,未经身份验证的攻击者可通过该漏洞获取数据库敏感信息,深入利用可控制整个web服务器。 …

计算机图形学:直线生成算法—DDA

DDA&#xff08;Digital Differential Analyzer&#xff0c;数字差分分析器&#xff09;算法是一种基本的直线生成算法&#xff0c;通常用于计算机图形学中。它通过将直线划分为若干个等间隔的小线段&#xff0c;然后在每个小线段中选择一个像素点进行绘制&#xff0c;从而近似…

R-Tree:空间索引技术原理及实现详解

R-Tree&#xff1a;空间索引技术原理及实现详解 一、引言 在空间数据库中&#xff0c;如何高效地查询和处理空间数据一直是研究的热点。R-Tree作为一种重要的空间索引结构&#xff0c;在地理信息系统&#xff08;GIS&#xff09;、空间数据库管理系统等领域得到了广泛应用。本…

三十二章、Cesium从入门到精通;

一、打造第一个Cesium程序&#xff1b; 1、基础概念&#xff1b; 父子组件之间可以传递数据&#xff1a;props、回传事件&#xff1b; 使用Redux使用场景&#xff1a;兄弟&#xff1b; 2、代码样例&#xff1b; 11111111 二、Cesium基础设置&#xff1b; 三、讲解viewer…

产品原型图概念

产品原型图概念 产品原型图作用 如下图&#xff1a; 产品原型图的三种分类 线框图 通过【线段色块文字】描述产品页面。优点&#xff1a;制作快速。 缺点&#xff1a;传递信息容易遗漏。 应用&#xff1a;早期方案讨论&#xff0c;需要快速输出的场景&#xff0c;团队配合…

Java算法必备之快读

背景: 在一些算法题中,由于数据量过大,可能会出现卡输入输出时间的问题 原理: 在Java中,输入通常是使用Scanner,输出使用System.out,先说输入 Scanner in new Scanner(System.in);慢的原因有两方面: System.in在读取的时候是字节流进行读取,是一个字节一个字节读取的,在读取…

【工作杂记】groupBy排序-操作word

1.stream 流 groupBy 排序 stream流groupBy默认使用的HashMap&#xff0c;无序的&#xff0c;想要实现有序&#xff0c;需要手动指定接收的map类型 例子&#xff1a; Map<Date, List<OrderVo>> dataMap voList.stream().sorted(Comparator.comparing(OrderVo::ge…

华为OD-C卷-执行任务赚积分[100分]C++ 100%

题目描述 现有N个任务需要处理,同一时间只能处理一个任务,处理每个任务所需要的时间固定为1。 每个任务都有最晚处理时间限制和积分值,在最晚处理时间点之前处理完成任务才可获得对应的积分奖励。 可用于处理任务的时间有限,请问在有限的时间内,可获得的最多积分。 输…

Learn ComputeShader 01 First Computer Shader

使用Unity版本&#xff1a;2019.4.12f1 整体流程&#xff1a; 1添加一个quad object并添加一个无光照材质 2.相机投影模式设置为正交 3.调整quad使其完全显示在相机内 4.创建脚本并且使用计算着色器覆盖quad的纹理 5.创建一个compute shader 前三步完成以后结果应该是这…

网络基础先导

前言&#xff1a;最好在牢固前面几大件&#xff08;编程语言、数据结构、操作系统&#xff09;&#xff0c;并且您有一个服务器的基础上&#xff08;我使用的是腾讯云中配置最低的服务器&#xff09;再来学习本系列的网络知识。 1.网络发展简要 下面就是简单提及一些概念而已&…

多线程(64)如何设计一个高性能的订单处理系统

设计一个高性能的订单处理系统需要考虑多个方面&#xff0c;包括但不限于系统架构、数据一致性、可伸缩性、容错性以及性能优化。以下是设计这样一个系统的一些关键考虑因素和实现策略。 系统架构 微服务架构&#xff1a;将订单系统分解成独立的微服务&#xff0c;例如订单创建…

二叉树之AVL树

文章目录 1. AVL树的概念&#xff08;logN)1.1背景1.2规则 2.AVL树节点的定义3.AVL树的插入4. AVL树的旋转(重点&#xff09;4.1 新节点插入较高的右子树的右侧&#xff1a;左单璇&#xff1b;4.2 新节点插入较高左子树的左侧&#xff1a;右单璇&#xff1b;4.3&#xff08;双旋…

AJAX——ajax原理

1.XMLHttpRequest 定义&#xff1a;XMLHttpRequest&#xff08;XHR&#xff09;对象用于与服务器交互。通过XMLHttpRequest可以在不刷新页面的情况下请求特定URL&#xff0c;获取数据。这允许网页在不影响用户操作的情况下&#xff0c;更新页面的局部内容。XMLHttpRequest在AJA…

数据输入输出流(I/O)

文章目录 前言一、数据输入输出流是什么&#xff1f;二、使用方法 1.DataInputStream类2.DataOutoutStream类3.实操展示总结 前言 数据输入输出流也是将文件输入输出流打包后使用的对象。相比于文件输入输出流&#xff0c;数据输入输出流提供了简单易用的方法去操作不同类型的数…

【FreeRTOS】常用API接口

【FreeRTOS】常用API接口 为方便快速检索&#xff0c;这里只留下对应的接口名和功能注释&#xff0c;具体传参和使用方法拿函数名百度搜。 任务相关 xTaskCreate() //创建任务 vTaskDelete( NULL ); //删除任务&#xff0c;传入NULL为删除当前的任务 vTaskStartScheduler()&…

不需要在 HTML 中添加任何额外的标签,就能实现复杂的设计效果。

1. 基础知识 什么是伪元素选择器 伪元素选择器用来指定一个元素的特定部分或者在元素中创建虚拟内容。 最常见的伪元素选择器包括 ::before 和 ::after&#xff0c;它们分别用于在元素内容的前面和后面添加内容或样式。 伪元素选择器是为了增强对元素的控制&#xff0c;它们…