【LeetCode 55】【LeetCode 45】 跳跃游戏
55. 跳跃游戏
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
示例 1:
输入: [2,3,1,1,4] 输出: true 解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。
示例 2:
输入: [3,2,1,0,4] 输出: false 解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。
解法1:
贪心,遍历所有的元素,维护的指标为当前能够达到的最大值,该最大值由上一次跳跃的最大值和这次跳跃的距离取较大值
- 一定要遍历所有的元素,而不是跳跃
- 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】 跳跃游戏相关推荐
- Leetcode 45. 跳跃游戏 II
Leetcode 45. 跳跃游戏 II 题目 给你一个非负整数数组 nums ,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组 ...
- leetcode 45. 跳跃游戏 II 46. 全排列
leetcode 45. 跳跃游戏 II 46. 全排列 45. 跳跃游戏 II 难度中等1273收藏分享切换为英文接收动态反馈 给你一个非负整数数组 nums ,你最初位于数组的第一个位置. 数组中 ...
- LeetCode 45.跳跃游戏II
45.跳跃游戏 II 题目描述 给你一个非负整数数组 nums ,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. ...
- leetcode 45.跳跃游戏 II
一.题意 给出一个非负整数数组 nums ,数组中的每个元素代表在该位置可以跳跃的最大长度.使用最少的跳跃次数到达数组的最后一个位置.假设总是可以到达数组的最后一个位置. 二.解法 贪心算法. 解法一 ...
- _28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II 、55.跳跃游戏、45.跳跃游戏II
_28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II .55.跳跃游戏.45.跳跃游戏II 题目列表 122.买卖股票的最佳时机II 55.跳跃游戏 45 ...
- 代码随想录算法训练营第三十二天_第八章_贪心算法 | 122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II
LeetCode 122.买卖股票的最佳时机II 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格.设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票 ...
- Leetcode-D21-动态规划(二刷)-55. 跳跃游戏45. 跳跃游戏 II
我导好好啊!!!刚找完他!充满动力,给个大标题! 55. 跳跃游戏 1.感觉不像是一道很明显的动态规划问题. 2.看下答案和自己的思路是否一致.和我的想法一下,敲代码叭! 3.通过了,但这次好慢呀 c ...
- 力扣记录:贪心算法3较难(1)区间问题——55 跳跃游戏,45 跳跃游戏II,452 用最少数量的箭引爆气球,435 无重叠区间,763 划分字母区间,56 合并区间
本次题目 55 跳跃游戏 45 跳跃游戏II 452 用最少数量的箭引爆气球 435 无重叠区间 763 划分字母区间 56 合并区间 55 跳跃游戏 局部最优:不管每次跳多少步,取最大跳跃步数,若覆 ...
- LeetCode-笔记-45.跳跃游戏II-贪心算法
LeetCode-笔记-45.跳跃游戏II-贪心算法 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后 ...
- 45. 跳跃游戏 II golang 动态规划
45. 跳跃游戏 II 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [ ...
最新文章
- 纽约时报:华为大举挺进美国市场
- Java中的文件下载
- nacos单机模式使用mysql库_Nacos docker 单机模式,mysql 搭建
- MyBatis全局配置文件和映射文件
- 韩顺平php视频笔记77 抽象类vs接口 关键字final const
- 【Antlr】Antlr语法设计
- 01-05 Linux常用命令-性能统计
- java aop设计_Spring4.x基础配置(三):Spring AOP
- oracle经典面试题以及解答
- [Java] 蓝桥杯ALGO-12 算法训练 幂方分解
- JAVA中堆和栈的区别
- 自动化测试pytest测试框架实例
- vscode设置背景图片
- 【Algorithm】逆序数的分治求解
- Jupyter 中 ValueError: Duplicate names are not allowed.的问题解决
- udp程序启动后检测都是未启动_【例子教程】联想Leez P710 物联网AI物体检测
- 利用Gazebo搭建赛道,控制小车完成比赛(大学生智能车大赛室外光电组赛道仿真模拟)
- c语言char a什么意思,C语言中char *a[ ]什么意思,他和char (*)a[ ]有什么什么区别?...
- 个性化PageRank算法
- 鸟哥Linux学习之——数据流重定向
热门文章
- 无线路由器、AP、胖AP、瘦AP的概念区别
- 一种可行的简单的Scene结构in cocos2d
- greenplum分区表查看所占空间大小
- java通过异常处理错误_java 通过异常处理错误
- canoco5主成分分析步骤_基于R语言的主成分分析
- 运算符的优先级和实际操作
- Java迭代器中的next()方法
- c监控进程发现未启动就启动进程_非常有用的16个Linux 服务器监控命令
- mysql模板引擎有哪些_ecshop用的是什么模板引擎?
- php ajax成功失败,php – 让$.ajax失败