[array] leetcode-55. Jump Game - Medium
leetcode-55. Jump Game - Medium
descrition
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.
For example:
A = [2,3,1,1,4], return true.
A = [3,2,1,0,4], return false.
解析
这是一道动态规划的题,官网有很详细的解答leetcode-solution
动态规划算法的设计步骤:
- 递归回溯求解(自顶向下)
- 使用记忆回溯法求解 (自顶向下的动态规划)
- 去掉递归,使用自底向上的动态规划
- 进一步使用技巧优化自底向上的动态规划
根据以上步骤得到以下的解决方法。代码只给出最有解,其他可参考官网的 solution。
方法 1 :
回溯法,recursive(vector& nums, int icur)
- 如果 icur == nums.size() - 1,到达最后一个位置,递归的出口,表示可以到达最后,返回 true。
- 递归:i, 1+icur <= i <= min(icur+nums[icur], n-1)
即对每一种情况都递归检查一遍。
时间复杂度-O(2^n); 空间复杂度-O(n),递归需要额外的空间。
方法 2
实际上就是在方法 1 的基础上系上一个 memory 数组,表示当前访问下标 icur 的状态,这样可以避免重复计算。
递归函数可以定义为:recursive(vector& nums, int icur, vector& memory)
时间复杂度-O(n^2),n 个元素,没个元素最多有 n 种可能;空间复杂度-O(n),递归需要额外空间。
方法 3
方法 1 和 方法 2 在对每一步进行试探时从近到远。还可以考虑从远到近进行检查,即每次都从可能到大的最远处进行检查。这种方法的时间复杂度并没有优化,但是从实践的角度可以进行一定的优化。
方法 4
动态规划方法。假设数组 dp[i] 表示位置 i 的状态:UNKONW, GOOD, BAD,分别表示未知,可达,不可达状态。
那么对于任意位置 i ,检查所有的 j = [i+1, min(i+nums[i], n-1)] 的状态,只要有一个 dp[j] = GOOD,则说明 dp[i] 也是 GOOD。边界条件 dp[n-1] = GOOD。
最后我们只需要检查 dp[0] 是否等于 GOOD 即可。
方法 5
对动态规划的进一步优化。核心思想贪心。我们可以从两个角度来看。最优解,时间复杂度-O(n),空间复杂度-O(1)。
1. 从右往左遍历
令 lastPos 表示当前可以到达的最靠近左边的位置。从右边往左边遍历:for(int i=n-1; i>=0, i--)
对任意 i,最远可到达的位置为 farthest = i + nums[i],如果 farthest >= lastPos,则说明从当前位置可以到达最尾的位置,此时更新 lastPos = i 。
最后检查 lastPos 是否为 0 即可。
2. 从左往右遍历
令 farthest 表示能到达的最远距离,我们从左往右遍历:for(int i=0; i<n; i++)。直观来说就是我们每次都往前移动一步,如果 i > farthest 则说明不可能到达最尾节点,直接返回 false。循环中每次都更新 farthest = max(i+nums[i], farthest)。
如果循环能顺利结束,则说明可以到达最尾节点。
code
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution{
public:
bool canJump(vector<int>& nums){
//return canJumpRight2Left(nums);
return canJumpLeft2Right(nums);
}
bool canJumpRight2Left(vector<int>& nums){
int lastPos = nums.size() - 1;
for(int i=nums.size()-1; i>=0; i--){
if((i + nums[i]) >= lastPos){
lastPos = i;
}
}
return lastPos == 0;
}
bool canJumpLeft2Right(vector<int>& nums){
int farthest = 0;
for(int i=0; i<nums.size(); i++){
if( i > farthest)
return false;
farthest = max(i + nums[i], farthest);
}
return true;
}
};
int main()
{
return 0;
}
[array] leetcode-55. Jump Game - Medium的更多相关文章
- [LeetCode] 55. Jump Game_ Medium tag: Dynamic Programming
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- Leetcode 55. Jump Game & 45. Jump Game II
55. Jump Game Description Given an array of non-negative integers, you are initially positioned at t ...
- [array] leetcode - 48. Rotate Image - Medium
leetcode - 48. Rotate Image - Medium descrition You are given an n x n 2D matrix representing an ima ...
- [array] leetcode - 39. Combination Sum - Medium
leetcode - 39. Combination Sum - Medium descrition Given a set of candidate numbers (C) (without dup ...
- [array] leetcode - 31. Next Permutation - Medium
leetcode - 31. Next Permutation - Medium descrition Implement next permutation, which rearranges num ...
- leetcode 55. Jump Game、45. Jump Game II(贪心)
55. Jump Game 第一种方法: 只要找到一个方式可以到达,那当前位置就是可以到达的,所以可以break class Solution { public: bool canJump(vecto ...
- LeetCode: 55. Jump Game(Medium)
1. 原题链接 https://leetcode.com/problems/jump-game/description/ 2. 题目要求 给定一个整型数组,数组中没有负数.从第一个元素开始,每个元素的 ...
- [leetcode] 55. Jump Game (Medium)
原题 题目意思即 每一格代表你当前最多能再往后跳几次,从第一格开始,如果能跳到最后一格返回true,反之为false. 思路:用一个下标记录当前最多能跳到哪一格,遍历一遍 --> 如果当前格子不 ...
- [LeetCode] 55. Jump Game 跳跃游戏
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- Jump Game 的三种思路 - leetcode 55. Jump Game
Jump Game 是一道有意思的题目.题意很简单,给你一个数组,数组的每个元素表示你能前进的最大步数,最开始时你在第一个元素所在的位置,之后你可以前进,问能不能到达最后一个元素位置. 比如: A = ...
随机推荐
- JAVA基础2——类初始化相关执行顺序
类初始化相关执行顺序 几个概念说明 代码块的含义与作用 static静态代码块: 一般用于初始化类中的静态变量.比如:给静态的数组或者list变量赋初值.使用static静态代码块进行初始化与直接在定 ...
- asp.net core 实现一个简单的仓储
一直有自己写个框架的想法,但是一直没有行动起来,最近比较闲,正好可以开工了. 现在已经完成了两部分.1.一个简单仓储,实现使用的是ef 2.IOC部分,这里是把内置的ioc替换成了aotofac,这部 ...
- Javascript CustomEvent
Javascript CustomEvent 原文链接 https://davidwalsh.name/customevent,看到一篇介绍自定义事件的文章 翻译一下,不足之处,还请指正. 自浏览器诞 ...
- Glance 镜像服务群集
#Glance 镜像服务群集 openstack pike 部署 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html#4.Glance 镜像服务群集 ##. ...
- js实现谷歌网站统计
基本方法 function ga() { if (window.ga) { window.ga.apply(null, arguments); } else { stack.push(argument ...
- java 之 适配器模式(大话设计模式)
适配器模式,笔者不是很推荐在项目初期阶段使用,在笔者看来这个设计模式就是套接了一层,从而达到能够迎合现有的外部接口规范. 先来简单的看下类图: 大话设计模式-类图 这个模式理解起来非常简单,A→B因为 ...
- Keepalived实现双机热备
第一步.安装.网上很多源码安装的步骤.咱们这里以最快的方式 . [Shell] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 ...
- 自定义spring mvc的json视图
场景 前端(安卓,Ios,web前端)和后端进行了数据的格式规范的讨论,确定了json的数据格式: { "code":"200", "data&quo ...
- bootstrap-select多选下拉列表插件使用小记
下载插件 插件地址:http://silviomoreto.github.io/bootstrap-select/ 下载好后引用css和js文件 <!-- 因为是jquery插件,所以引用前先引 ...
- Xamarin.iOS + MvvmCross: UIPickerView data binding, SelectedItemChanged event
UI initialization: _pickerView = new UIPickerView(); _pickerView.ShowSelectionIndicator = true; _pic ...