作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/


题目地址:https://leetcode.com/problems/jump-game/description/

题目描述

Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Determine if you are able to reach the last index.

Example 1:

Input: [2,3,1,1,4]
Output: true
Explanation: Jump 1 step from index 0 to 1, then 3 steps to the last index.

Example 2:

Input: [3,2,1,0,4]
Output: false
Explanation: You will always arrive at index 3 no matter what. Its maximum
jump length is 0, which makes it impossible to reach the last index.

题目大意

每个位置上的数字代表了最多可以向右跳多少步,问能不能跳到最右边的位置。

解题方法

贪心

这个题的tag是贪心,贪心策略是我们每次都选取最优的策略,然后前面已经选好了的就不用管了。

这个题的贪心方法是,我们使用一个变量reach保存当前能到达的最后位置索引,那么在每个位置的时候判断这个位置能不能到达,即位置的索引大于了reach说明前面无论怎么走也走不到这个位置,就返回False好了。如果这个位置可以到达,那么要维护一下这个reach,更新策略是当前位置索引+这个数字代表的能向右走多少步,这个代表了到达当前位置的时候向右能到达的最远距离,在这个最远距离以内的任何位置都能到,因为每次跳的步数可以变小的。那么进行了这么一次循环以后,每个位置都判断为能到达,所以结果返回True就好了。

时间复杂度是O(N),空间复杂度是O(1).

Python代码如下:

class Solution(object):
def canJump(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
reach = 0
for i, num in enumerate(nums):
if i > reach:
return False
reach = max(reach, i + num)
return True

C++代码如下:

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

贪心和DP的比较

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来最好的选择。也就是说,不从整体最优上加以考虑,他所作出的是在某种意义上的局部最优解。贪心算法和动态规划算法都是由局部最优导出全局最优,这里不得不比较下二者的区别。

贪心算法:
1.贪心算法中,作出的每步贪心决策都无法改变,因为贪心策略是由上一步的最优解推导下一步的最优解,而上一步之前的最优解则不作保留;
2.由(1)中的介绍,可以知道贪心法正确的条件是:每一步的最优解一定包含上一步的最优解。

动态规划算法:
1.全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解
2.动态规划的关键是状态转移方程,即如何由以求出的局部最优解来推导全局最优解;
3.边界条件:即最简单的,可以直接得出的局部最优解。

参考资料:

贪心和DP的比较

日期

2018 年 10 月 28 日 —— 10月份最后一个周一
2019 年 1 月 11 日 —— 小光棍节?

最新文章

  1. iOS 学习笔记二【cocopods安装使用和安装过程中遇到的问题及解决办法】【20160725更新】
  2. xmpp整理笔记:环境的快速配置(附安装包)
  3. Final-阶段站立会议3
  4. matlab中图像显示函数
  5. POJ 3233 Matrix Power Series 矩阵快速幂
  6. Microsoft SDK 中Sample案例之Amcap項目 的运行方法(转)
  7. 未指定的错误,发生了一个 Oracle 错误,但无法从 Oracle 中检索错误信息。数据类型不被支持。
  8. 如何完全禁用或卸载Windows 10中的OneDrive - 51CTO.COM
  9. JavaWeb学习笔记--HttpServletRequest、HttpServletResponse对象常用方法
  10. 不规则三角网 Delaunay——TIN
  11. ccf cv讲座记录
  12. canvas基础语法
  13. Eclipse 配置scala开发环境(windows)
  14. 敏捷冲刺每日报告--day2
  15. ESP8266代码中的存储标记
  16. PHP require php &gt; 5.3.0
  17. 批处理 ------ @、ECHO OFF、ECHO ON 的使用
  18. python3用BeautifulSoup用limit来获取指定数量的a标签
  19. wxWidgets与其他工具库的比较(上)
  20. jap _spring _maven

热门文章

  1. SSH客户端工具连接Linux(有的也可以连接Windows、mac、iOS等多系统平台)
  2. 巩固javaweb第十五天
  3. java中类实现Serializable接口的原因
  4. Git提交规范
  5. Vue相关,vue.nextTick
  6. Vue相关,vue父子组件生命周期执行顺序。
  7. 【leetcode】633. Sum of Square Numbers(two-sum 变形)
  8. 容器之分类与各种测试(四)——unordered_set和unordered_map
  9. Linux系统中安装软件方法总结
  10. delete() and free() in C++