当前位置: 首页 > news >正文

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 哈佛大学单细胞课程|笔记汇总 (二)
  • Jenkins保姆笔记(1)——基于Java8的Jenkins安装部署
  • 使用Cisco进行模拟RIP路由协议配置
  • 文献解读-肿瘤测序-第二十七期|《敲减通过控制TOP2A下调的NUSAP1可以抑制人胶质母细胞瘤的细胞增殖和侵袭》
  • Prometheus 笔记
  • Stable Diffusion之最全详解图解
  • 采用Spring Cloud +UniApp +MySql技术开发,SaaS模式的一套智慧工地云平台源码,支持多端展示:PC端、大屏端、手机端、平板端
  • 科普文:微服务之Spring Cloud Alibaba组件Nacos一致性协议Distro+Raft概叙
  • 下载qwen2-72b报错
  • uniapp 使用renderjs通信
  • vue设置每次加载页面时展示一个双开门效果
  • 芯感智最新流量传感器GF*000系列应用于医疗方向
  • IoTDB 入门教程 基础篇⑪——Data导入导出工具
  • Vue3+TS+element plus实现一个简单列表页面
  • 《Milvus Cloud向量数据库指南》——Milvus Cloud——Ivy.ai业务创新的坚实基石
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • JavaScript学习总结——原型
  • Java读取Properties文件的六种方法
  • Laravel 实践之路: 数据库迁移与数据填充
  • PHP 小技巧
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • spring学习第二天
  • TypeScript实现数据结构(一)栈,队列,链表
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 程序员最讨厌的9句话,你可有补充?
  • 分类模型——Logistics Regression
  • 猴子数据域名防封接口降低小说被封的风险
  • ------- 计算机网络基础
  • 前端js -- this指向总结。
  • 使用 Docker 部署 Spring Boot项目
  • 为视图添加丝滑的水波纹
  • 硬币翻转问题,区间操作
  • 源码安装memcached和php memcache扩展
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • ​Java并发新构件之Exchanger
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​渐进式Web应用PWA的未来
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #HarmonyOS:基础语法
  • #Ubuntu(修改root信息)
  • $().each和$.each的区别
  • (13)Hive调优——动态分区导致的小文件问题
  • (6)STL算法之转换
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (四)c52学习之旅-流水LED灯
  • (一)kafka实战——kafka源码编译启动
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • ****Linux下Mysql的安装和配置
  • .ai域名是什么后缀?
  • .describe() python_Python-Win32com-Excel
  • .net 7 上传文件踩坑
  • .NET Framework 服务实现监控可观测性最佳实践
  • .Net Memory Profiler的使用举例