55. 跳跃游戏

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

示例 1:

输入: [2,3,1,1,4]
输出: true
解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。

示例 2:

输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

解法1:

贪心,遍历所有的元素,维护的指标为当前能够达到的最大值,该最大值由上一次跳跃的最大值和这次跳跃的距离取较大值

  1. 一定要遍历所有的元素,而不是跳跃
  2. maxreach的更新方法:max(上一次跳跃的最大值,本次跳跃的最大距离)
#include<bits/stdc++.h>
using namespace std;
class Solution {
public:bool canJump(vector<int>& nums) {int N=nums.size();int maxreach=0;//注意是下标值而不是元素值for(int i=0;i<N;i++){//maxreach停止了,i仍然在增加if(i>maxreach)return false;maxreach=max(maxreach,i+nums[i]);//更新if(maxreach>=N-1)return true;}}//bool
};
int main(){int n;cin>>n;vector<int>a;for(int i=0;i<n;i++){int x;cin>>x;a.push_back(x);}Solution work;if(work.canJump(a))cout<<"true"<<endl;elsecout<<"false"<<endl;
}
/*
2 3 1 1 4
3 2 1 0 4
3 0 8 2 0 0 7
*/

解法2

由于数组元素大于等于0,所以当且仅当数组中有0,才可能过不去;其他情况一定可以跳到终点。

因此找到数组中的0元素,对于每一个0元素,查看其是否可以过去;

重点:不能过去的充要条件是:0元素之前所有元素的值不大于该元素与0元素的距离

#include<bits/stdc++.h>
using namespace std;
class Solution {
public:bool canJump(vector<int>& nums) {int N=nums.size();if(N<=1)    return true;if(nums[0]==0)  return false;//点数N>1,不可能跳到终点for(int i=1;i!=N-1;i++){//遍历:第2个点到倒数第2个点if(nums[i]==0){vector<int>subnums(nums.begin(),nums.begin()+i);if(!jumpZERO(subnums))return false;}}return true;}//bool
private:bool jumpZERO(vector<int>& subnums){vector<int>::iterator it;for(it=subnums.begin();it!=subnums.end();it++){//当前点可以跳到末尾0,就可以通过if(*it>(subnums.end()-it))return true;}return false;}
};
int main(){int n;cin>>n;vector<int>a;for(int i=0;i<n;i++){int x;cin>>x;a.push_back(x);}Solution work;if(work.canJump(a))cout<<"true"<<endl;elsecout<<"false"<<endl;
}
/*
2 3 1 1 4
3 2 1 0 4
3 0 8 2 0 0 7
*/

45. 跳跃游戏 II

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

示例:

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

这道题的要求是给定一整数数组,数组元素表示每次可以跳跃的最大距离。然后初始位置在数组的第一个元素,目的是以最少的步数到达最后元素。

这道题是Jump Game II,是其Jump Game的扩展。

在Jump Game中,采用贪心的思路,采用reach变量维护能到达最远处,即为全局最优解。当遍历到i的时候,局部最优解为A[i]+i,因此,此时的全局最优解即为reach和A[i]+i的最大值:reach = max(reach, A[i] + i)。

而这道题,需要求的是最少的步数。因此需要添加step变量记录最少步数。至于什么时候step需要加1?答案是当前的i超过了前一步的最远位置。所以引入last变量记录上一步能到达的最远位置。reach、step、last的初始值均为0。当遍历到i的时候,如果i超过了last(即上一步能到达的最远位置),说明步数需要加1(即step++),此时仍需要更新last为当前最远位置reach。全程只需遍历1次数组,而且空间复杂度为常量。

时间复杂度:O(n)

空间复杂度:O(1)

class Solution {
public:int jump(vector<int>& nums) {int n=nums.size();int reach=0;int step=0;int last=0;//上一步能达到的最远位置for(int i=0;i<=reach&&i<n;i++){if(i>last){++step;last=reach;}reach=max(reach,nums[i]+i);}return reach>=n-1?step:0;}
};

【LeetCode 55】【LeetCode 45】 跳跃游戏相关推荐

  1. Leetcode 45. 跳跃游戏 II

    Leetcode 45. 跳跃游戏 II 题目 给你一个非负整数数组 nums ,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组 ...

  2. leetcode 45. 跳跃游戏 II 46. 全排列

    leetcode 45. 跳跃游戏 II 46. 全排列 45. 跳跃游戏 II 难度中等1273收藏分享切换为英文接收动态反馈 给你一个非负整数数组 nums ,你最初位于数组的第一个位置. 数组中 ...

  3. LeetCode 45.跳跃游戏II

    45.跳跃游戏 II 题目描述 给你一个非负整数数组 nums ,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. ...

  4. leetcode 45.跳跃游戏 II

    一.题意 给出一个非负整数数组 nums ,数组中的每个元素代表在该位置可以跳跃的最大长度.使用最少的跳跃次数到达数组的最后一个位置.假设总是可以到达数组的最后一个位置. 二.解法 贪心算法. 解法一 ...

  5. _28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II 、55.跳跃游戏、45.跳跃游戏II

    _28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II .55.跳跃游戏.45.跳跃游戏II 题目列表 122.买卖股票的最佳时机II 55.跳跃游戏 45 ...

  6. 代码随想录算法训练营第三十二天_第八章_贪心算法 | 122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II

    LeetCode 122.买卖股票的最佳时机II 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格.设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票 ...

  7. Leetcode-D21-动态规划(二刷)-55. 跳跃游戏45. 跳跃游戏 II

    我导好好啊!!!刚找完他!充满动力,给个大标题! 55. 跳跃游戏 1.感觉不像是一道很明显的动态规划问题. 2.看下答案和自己的思路是否一致.和我的想法一下,敲代码叭! 3.通过了,但这次好慢呀 c ...

  8. 力扣记录:贪心算法3较难(1)区间问题——55 跳跃游戏,45 跳跃游戏II,452 用最少数量的箭引爆气球,435 无重叠区间,763 划分字母区间,56 合并区间

    本次题目 55 跳跃游戏 45 跳跃游戏II 452 用最少数量的箭引爆气球 435 无重叠区间 763 划分字母区间 56 合并区间 55 跳跃游戏 局部最优:不管每次跳多少步,取最大跳跃步数,若覆 ...

  9. LeetCode-笔记-45.跳跃游戏II-贪心算法

    LeetCode-笔记-45.跳跃游戏II-贪心算法 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后 ...

  10. 45. 跳跃游戏 II golang 动态规划

    45. 跳跃游戏 II 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [ ...

最新文章

  1. 纽约时报:华为大举挺进美国市场
  2. Java中的文件下载
  3. nacos单机模式使用mysql库_Nacos docker 单机模式,mysql 搭建
  4. MyBatis全局配置文件和映射文件
  5. 韩顺平php视频笔记77 抽象类vs接口 关键字final const
  6. 【Antlr】Antlr语法设计
  7. 01-05 Linux常用命令-性能统计
  8. java aop设计_Spring4.x基础配置(三):Spring AOP
  9. oracle经典面试题以及解答
  10. [Java] 蓝桥杯ALGO-12 算法训练 幂方分解
  11. JAVA中堆和栈的区别
  12. 自动化测试pytest测试框架实例
  13. vscode设置背景图片
  14. 【Algorithm】逆序数的分治求解
  15. Jupyter 中 ValueError: Duplicate names are not allowed.的问题解决
  16. udp程序启动后检测都是未启动_【例子教程】联想Leez P710 物联网AI物体检测
  17. 利用Gazebo搭建赛道,控制小车完成比赛(大学生智能车大赛室外光电组赛道仿真模拟)
  18. c语言char a什么意思,C语言中char *a[ ]什么意思,他和char (*)a[ ]有什么什么区别?...
  19. 个性化PageRank算法
  20. 鸟哥Linux学习之——数据流重定向

热门文章

  1. 无线路由器、AP、胖AP、瘦AP的概念区别
  2. 一种可行的简单的Scene结构in cocos2d
  3. greenplum分区表查看所占空间大小
  4. java通过异常处理错误_java 通过异常处理错误
  5. canoco5主成分分析步骤_基于R语言的主成分分析
  6. 运算符的优先级和实际操作
  7. Java迭代器中的next()方法
  8. c监控进程发现未启动就启动进程_非常有用的16个Linux 服务器监控命令
  9. mysql模板引擎有哪些_ecshop用的是什么模板引擎?
  10. php ajax成功失败,php – 让$.ajax失败