力扣第45题:跳跃游戏 贪心DP(C++)

news2024/11/24 19:14:39

给定一个长度为 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]

示例 :

输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

思路

思考一个问题:如果在位置j不能跳到位置i(j<i),那么j能跳到i+1吗?

注意,在j处能跳到的最远位置是下标j+nums[j]的位置。如果j不能跳到i,那么i就大于这个最远位置。
那么显然j是不能跳到i+1的的。记住这件事,他是求DP时贪心的关键条件。

解题过程

DP数组的实现就不必多说了,无非是dp[i]=dp[j]+1(到i的最少步数是j的步数+1,其中j是前面的所有能跳到i的位置里步数最少的)只是还不知道j是多少而已。

问题来了,对于每一个i,怎么找到前置j?

DP数组一定越来越大,所有我们一定要尽量从前开始找j

为了跳到i,我们需要找到从前向后第一个j+nums[j]>=i的j。

但是对于每一个i,我们需要每次都从0开始找j吗?
回想到我们的思考:如果j不能跳到i,那自然就不能跳到i+1

因此,j不需要重置为0
i+1的前置j一定大于等于i的前置j

主体部分如下:

        for(int i=1,j=0;i<len;i++){ 
            while(j+nums[j]<i)j++;
            dp[i]=dp[j]+1;
        }
复杂度

时间复杂度: O(n)
空间复杂度: O(n)

复杂度分析:
i会遍历一次数组,他的前置位置j也只会遍历一次数组,时间复杂度是线性的。
使用了常量空间的双指针和长度为n的DP数组,空间复杂度是线性的。

Code

class Solution {
public:
    int jump(vector<int>& nums) {
        const int len=nums.size();
        vector<int>dp(len,0);
        for(int i=1,j=0;i<len;i++){
            while(j+nums[j]<i)j++;
            dp[i]=dp[j]+1;
        }
        return dp[len-1];
    }
};

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

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

相关文章

【附保姆级教程】两个月内快速涨粉17万,变现2w+,儿童英语阅读,家长辅导孩子必备!

目录 一、前言 二、儿童英语阅读教程 第一步&#xff1a;利用AI代写英语阅读短文 第二步&#xff1a;使用Flux生成场景图 第三步&#xff1a;将文本转为音频 第四步&#xff1a;使用canva工具进行排版 第五步&#xff1a;剪辑视频 一、前言 大家好&#xff0c;我是小奇…

如何在国外市场推广中国游戏

在国外市场推广中国游戏需要一种考虑文化差异、市场偏好和有效营销渠道的战略方法。以下是成功向国际观众介绍和推广中国游戏的关键步骤和策略&#xff1a; 进行市场调研 了解目标市场&#xff1a;首先确定哪些外国市场对你的游戏最具潜力。考虑类似游戏类型的受欢迎程度、玩…

找工作准备刷题Day21 动态规划算法 (卡尔41期训练营 8.6)

上周有些事情回了趟老家&#xff0c;祝广大博友身体健康&#xff0c;多运动。前面的贪心算法题目后面慢慢补&#xff0c;近期找到了一个实习&#xff0c;大概持续三个月&#xff0c;现在计划是白天工作&#xff0c;晚上下班以后运动运动刷题。要加强牛客网那种两小时3道题的刷题…

【LVS】负载均衡--nat模式/实验

一、LVS运行原理 LVS:Linux Virtual Server &#xff0c;负载调度器&#xff0c;内核集成&#xff0c;章文嵩&#xff0c;阿里的四层 SLB(Server LoadBalance) 是基于LVSkeepalived 实现 LVS 官网 : http://www.linuxvirtualserver.org/ LVS 相关术语 VS: Virtual Server&…

poetry配置镜像

1.简介 poetry 是一个包管理和打包的工具。 在 Python 中&#xff0c;对于初学者来说&#xff0c;打包系统和依赖管理是非常复杂和难懂的。即使对于经验丰富的开发者&#xff0c;一个项目总是要同时创建多个文件&#xff1a; setup.py ,requirements.txt,setup.cfg , MANIFES…

Python爬虫入门:如何设置代理IP进行网络爬取或数据采集

在如今这个信息爆炸的时代&#xff0c;数据成为了最有价值的资源之一。而Python作为一种强大且易学的编程语言&#xff0c;被广泛应用于数据采集和网络爬虫中。然而&#xff0c;直接进行网络爬取往往会遇到IP被封禁的问题&#xff0c;因此使用代理IP就成了一个有效的解决方案。…

SpringBoot中读取配置的七种方法总结

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

Python | TypeError: unsupported operand type(s) for +=: ‘int’ and ‘str’

Python | TypeError: unsupported operand type(s) for : ‘int’ and ‘str’&#xff1a;深度解析 在Python编程中&#xff0c;遇到“TypeError: unsupported operand type(s) for : ‘int’ and ‘str’”这类错误通常意味着你尝试将一个整数&#xff08;int&#xff09;和…

基于OpenCV+MFC的视频读取与对象跟踪平台

基于OpenCVMFC的视频读取与对象跟踪平台 引言一、软件功能简介二、各个功能介绍1、视频操作模块功能介绍1.1打开视频1.2打开摄像头1.3开始录制1.4结束录制1.5暂停1.6恢复1.7关闭1.8还原 2、对象跟踪模块功能介绍2.1 BSM跟踪2.2 颜色跟踪2.3 光流跟踪2.4 KCF多对象跟踪 资源链接…

干货 | 2024步入数字化转型深水区,云原生业务稳定性如何保障(免费下载)

云原生业务的稳定性保障是一个涉及多个层面的复杂任务&#xff0c;以下是一些关键措施和策略&#xff0c;以确保云原生业务的高效稳定运行&#xff1a; 一、平台安全性评估与加固 云原生平台安全评估&#xff1a;对云原生平台&#xff08;如Kubernetes、Docker等&#xff09;…

数学建模--智能算法之鱼群算法

目录 核心原理 应用与实现 实现步骤 性能分析与改进 鱼群算法在解决哪些具体优化问题方面表现最佳&#xff1f; 如何根据不同的应用场景调整鱼群算法的参数设置以提高其性能&#xff1f; 鱼群算法与其他群体智能优化算法&#xff08;如遗传算法、粒子群优化&#xff09;…

鸿道Intewell工业操作系统ARM平台生态:飞腾E2000Q

在这个智能制造和工业自动化的新时代&#xff0c;工业操作系统不仅是技术进步的推动者&#xff0c;更是企业转型升级的加速器。随着全球工业的快速发展&#xff0c;对于能够适应复杂工业环境、满足多样化生产需求的工业操作系统的需求愈发迫切。 鸿道Intewell工业操作系统ARM…

【Java 第七篇章】异常处理

一、简介 Java 异常&#xff08;Exception&#xff09;是 Java 提供的一种用于处理程序中错误情况的机制。当 Java 程序运行时遇到无法继续执行的情况&#xff08;如数组越界、空指针引用等&#xff09;&#xff0c;就会抛出&#xff08;throw&#xff09;一个异常。异常处理是…

【书生大模型实战营第三期】入门岛 第2关 Python基础知识

1. 闯关任务 1 任务描述&#xff1a;实现一个 wordcount 函数&#xff0c;统计英文字符串中每个单词出现的次数。返回一个字典&#xff0c;key 为单词&#xff0c;value 为对应单词出现的次数。 上面是作者编写的代码&#xff0c;运行结果如下。 2. 闯关任务 2 任务描述&#x…

有限元和稀疏矩阵

对于大规模的有限元计算&#xff0c;系统的整体刚度矩阵是非常耗费内存的&#xff0c;以百万自由度为例&#xff0c;刚度矩阵K的大小为100万x100万&#xff0c;元素大小为双精度double&#xff0c;占用8 byte&#xff0c;那么K占用的内存为100万x100万x8 byte 8000G&#xff0…

【模版进阶】

模版进阶 小杨 一、非类型模版参数 模板参数分为类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可…

mysql数据库触发器同步数据

首先检查数据源库是否支持触发器&#xff0c;show ENGINES&#xff0c;如果FEDERATED是NO&#xff0c;表示未开启&#xff0c;如需开启&#xff0c;再mysql配置文件中&#xff0c;添加federated配置到mysqld下面。 一、同服务器不同库触发器同步&#xff0c;这里只举例插入数据…

【用Java学习数据结构系列】探索Java集合框架的无尽秘密pro

看到这句话的时候证明&#xff1a;此刻你我都在努力 加油陌生人 个人主页&#xff1a;Gu Gu Study专栏&#xff1a;用Java学习数据结构系列 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者&#xff…

修改SpringBoot启动图标banner

方式一: 将图标文件命名为banner放在resources目录下 文本文件banner 图片banner 方式二&#xff1a;通过配置文件指定图标路径 指定文本图标&#xff1a;spring.banner.locationclasspath:相对于resources下的位置 ("classpath:"可以省略) 指定图片作为图标: sprin…

C语言——扫雷游戏

扫雷游戏通常是一个由方格组成的区域内进行的&#xff0c;其中随机分布着一定数量的地雷 。玩家的目标是通过点击方格来标记出所有地雷的位置&#xff0c;同时避免自己点到地雷而导致游戏失败。游戏开始时&#xff0c;玩家通常只能看到一部分方格&#xff0c;而其余的方格则需要…