这是leetcode上的一道题。拿到这道题最容易想到是回溯算法,即递归从第一个元素开始跳,跳到某个元素之后在当前的位置上继续跳,如果不满足条件就回溯。之前一直不知道回溯的过程,今天可算是弄明白了。简单来说就是一个人站在十字路口选择了一条路走向目的地,而在这条路上可能还有十字路口,还得做选择,选择了一条接下去结果走不通(代表迭代完毕)返回最近的十字路口,选择另一条路走,走到头之后再返回最近的十字路口选择另一条,如此的迭代,当最近的十字路口的路(四个方向)都走完之后,返回上上一个十字路口。再找另外一条。如此的重复下去直到第一个十字路口的四个方向都选择完为止。回溯有很多种应用,比如二叉树的遍历。在一开始学习递归的时候自己一遇到这样形式的就不知道程序如何运行了 ,纠结程序是运行完第一个递归直接进入第二个递归还是一直运行第一个递归直到不满足条件后在运行第二条,当时由于自己不知道回溯这种东西,错以为运行一次递归后就直接运行第二条递归。其实是一直运行第一条递归直到不满足条件为止。然后回到当前节点的父结点去遍历右子树,如果右子树也为空,再往上返回一层遍历祖父结点的右子树。如此的循环。我这是比较抽象的说明,如果想看二叉树的具体遍历可以去看这篇博客

https://blog.csdn.net/I_love_blog/article/details/66971598

  PreOrderTraverse(T->lchild);//递归左子树      PreOrderTraverse(T->rchild);//递归右子树

这道题的解法C++代码

class Solution {
public:bool canJump(vector<int>& nums) {return tmp(0,nums);}bool tmp(int curr,vector<int> &nums){int j=nums.size()-1;if(curr==j)return true;int cnt=min(curr+nums[curr],j);for(int n=curr+1;n<=cnt;n++){if(tmp(n,nums))return true;}return false;}
};

在leetcode上提交后显示超时。我们可以看下这道题的算法复杂度有O(2^n)在其中会有很多的重复运算,比如tmp(2)就要计算很多次,如果我们能用一个数组去保存这些元素的结果就会省去很多时间,虽然需要一定的空间,但是速度有很大的提高还是值得的,其实动态规划就是典型的空间换时间的思想。

class Solution {
public:bool canJump(vector<int>& nums) {vector<int>dp(nums.size());//定义一个数组来存放元素是否可以遍历到最后dp[nums.size()-1]=1;//最后一个数一定可以到达自己跳自己return tmp(dp,0,nums);}bool tmp(vector<int>&dp,int curr,vector<int> &nums){if(dp[curr])return dp[curr]==1?true:false;int j=nums.size()-1;//if(curr==j)//return true;int cnt=min(curr+nums[curr],j);for(int n=curr+1;n<=cnt;n++){if(tmp(dp,n,nums)){dp[n]=1;//1代表该数据可以跳到最后return true;}}dp[curr]=-1;//-1代表该数据不可以跳到最后return false;}
};

通过dp来存放元素是否可以遍历到最后,在leetcode上提交不再显示超时。省时间的原因我们可以拿一个例子来说明,比如说第二个行不通的例子,我们可以发现无论从 3、2、1开始跳都会跳到0这个位置,而0这个位置是跳不到最后的。我们又发现无论从3开始跳还是从2、1开始都会跳到0这个位置,如果没有dp存放结果3、2、1跳的时候每次都要计算这个位置可不可以。我们存放了这个结果是false之后,无论哪个数跳到这都直接返回false省去了很多计算。但是我们发现这个算法中还是有很多冗余,我们只需要数组中的一个元素跳到最后就ok了,没有必要遍历整个数组。算法代码如下

class Solution {
public:bool canJump(vector<int>& nums) {
int k = 0;for (int i = 0; i < nums.size(); i++){if (i > k) return false;k = max(k, i + nums[i]);}return true;}
};

一道题教会你回溯、动态规划、贪心相关推荐

  1. c语言动态规划回溯的原理,「算法思想」分治、动态规划、回溯、贪心一锅炖...

    观感度:????? 口味:东北一锅出 烹饪时间:10min 本文已收录在Github github.com/Geekhyt,感谢Star. 数据结构与算法系列专栏第四弹来袭,往期专栏链接如下: 初学者 ...

  2. 用递归与分治策略求解网球循环赛日程表_分治、动态规划、回溯、贪心一锅炖

    「观感度:五颗星」 「口味:东北一锅出」 「烹饪时间:10min」 本文已收录在 Github github.com/Geekhyt,感谢Star. 数据结构与算法系列专栏第四弹来袭,往期专栏链接如下 ...

  3. 将分治、动态规划、回溯、贪心一锅炖

    微信搜索[前端食堂]你的前端食堂,记得按时吃饭. 本文已收录在Github github.com/Geekhyt,感谢Star. 数据结构与算法系列专栏第四弹来袭,往期专栏链接如下: 前端如何搞定数据 ...

  4. 动态规划从理论到实践-深入理解贪心/分治/回溯/动态规划的算法思想

    摘要:本文主要讲解常见的四种算法,分别为贪心算法:第一步选择最优的走法,算法不能做到全局最优:分治算法:一种处理问题的思想,使用递归来实现:回溯算法:我们枚举所有的解,找到满足期望的解,可以把求解过程 ...

  5. 《数据科学家养成手册》第十一章------算法学1(穷举,分治,回溯,贪心,迭代)

    1.对于计算机学科的人员,无论是怎么样子的工作都是需要了解算法的-----从而获得解决日常问题的基本的思路 2.计算机底层的数理计算逻辑仍然是"与""或"&qu ...

  6. 洛谷P1095守望者的逃离题解-伪动态规划/贪心

    链接 题目描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很 ...

  7. 动态规划/贪心 - 无重叠区间

    动态规划 dp[i]dp[i]dp[i]表示以区间iii结尾,可以共存最多的区间数量. dp[i]=max(dp[i],dp[j]+1)dp[i] = max(dp[i], dp[j] + 1)dp[ ...

  8. [剑指offer]面试题第[42]题[Leedcode][JAVA][第53题][最大子序和][动态规划][贪心][分治]

    [问题描述][第53题][最大子序和][中等] 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和.示例:输入: [-2,1,-3,4,-1,2,1, ...

  9. LeetCode 1024. 视频拼接(动态规划/贪心)

    文章目录 1. 题目 2. 解题 2.1 动态规划 2.2 贪心 1. 题目 你将会获得一系列视频片段,这些片段来自于一项持续时长为 T 秒的体育赛事.这些片段可能有所重叠,也可能长度不一. 视频片段 ...

最新文章

  1. mysql统计今日首充用户_电商用户行为MySQL分析
  2. python linux教程_在RedHat系统Linux上部署Python的Celery框架的教程
  3. SQL Server表结构和数据导入到MySQL
  4. BGP小实验(一)——小实验练练手走起来
  5. SAP Cloud for Customer动态控制任意UI元素的显示或隐藏
  6. springaop事务逻辑原理_搞懂Spring AOP,这一篇就够了
  7. 从网恋到失恋只需要一秒...
  8. [css] 行内元素和块级元素有什么区别,如何相互转换?
  9. 第十五节:SpringBoot使用JPA访问数据库
  10. VALSE学习(十八):复杂视频的深度高效分析与理解方法
  11. 如何在Win7 x64上的配置32位的PostgreSQL ODBC数据源
  12. 关于以主机命名的网站集
  13. 8个绝对不能错过的PPT免费素材网站
  14. 叮叮获取所有用户信息_钉钉小程序获取用户信息
  15. harbor搭建-主从复制
  16. 平凉锅盔西北美食的文化的传承之一
  17. 初创企业融资PPT模板
  18. 记录学习 - spring5
  19. 我与OutLook有个约会
  20. GDPR合规|数据控制者与数据处理者区别大吗?分别承担什么法律责任?

热门文章

  1. Cambridge partner
  2. counterfactual
  3. change from a ppt to the report
  4. Another hard to gain financial feedback 又是一个融不到资金的创业项目
  5. macOS的关于屏幕录制的快捷键和操作
  6. 如果自己做事情,一直这样做会有一个缺点
  7. double转整数问题
  8. 【转】dijkstra算法
  9. 在不进入Guest OS的情况下,取得Guest OS的IP地址
  10. cocos2d CCNode类(节点属性大全)