「这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战」
55. 跳跃游戏
题目描述
给定一个非负整数数组 nums
,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
示例 1:
1 | ini复制代码输入: nums = [2,3,1,1,4] |
示例 2:
1 | ini复制代码输入: nums = [3,2,1,0,4] |
解析
在计算是否能跳跃到最后一个位置,不需要考虑每次要跳 1步还是几步,只需要判断 调到的一格 是否能跳到最后一个数组元素位置,每次取最大的跳跃步数,判断是否有元素的跳跃范围达到最大的数组数目。
- 贪心算法:
- 局部最优:每次取最大的跳跃距离
- 全局最优:最后判断局部最优中是否有能满足条件的,满足则就是全局最优的结果
代码
1 | c++复制代码class Solution |
45. 跳跃游戏 II
题目描述
给你一个非负整数数组 nums
,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
示例 1:
1 | makefile复制代码输入: nums = [2,3,1,1,4] |
示例 2:
1 | ini复制代码输入: nums = [2,3,0,1,4] |
解析
与上一题思路相似,判断每一步能够到达的最远下标。如果当前能到达最远下标,则停止;如果不能到达最远下标,就继续走一步,判断下一步能否到达最远下标。
- 当移动下标到达了当前覆盖的最远距离下标时:
- 1、如果当前覆盖的最远距离下标时终点,直接返回,不需再走一步
- 2、如果当前覆盖的最远距离下标不是终点,需要再走一步
代码
1 | c++复制代码class Solution |
改进
不考虑移动后是否到达终点
1 | c++复制代码class Solution |
本文转载自: 掘金