持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情
快乐周三,一周的摇摆日,起飞起飞
跳跃游戏
该题出自力扣的55题 —— 跳跃游戏【中等题】,最近发现,中等题比简单题做得还多
审题
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。
- 这道题虽然是中等题,但是如果理解了题意就并不复杂,就是给出一个整型数组,里面的数值都是正整数,每个值都代表了可以跳跃的最大步数,只需要判断最终是否能到达最后一位即可返回true,否则返回false
- 每个值代表可以跳跃的最大长度,换而言之就是,只要不存在0,最终一定能到达最后一位。
- 如果存在0,也不一定就是false,判断前面的值是否能超越当前遇到的0即可
- 那么解题思路就是:
- 定义一个最大值,赋值为当前能走的最大步数,遍历数组,不能剪枝,因为可能中间存在最大的步数
- 如果数组长度等于1,那么不管是否等于0,都已经是最后一位了,直接返回true
- 如果首位就为0,那么直接返回false
- 每次遍历都对最大值变量减一,如果当前为0并且最大值变量为0并且不等于最后一位,则直接返回false
- 如果当前数值小于或等于最大变量,则跳过
- 如果当前数值大于最大变量,则取当前数值作为最大变量
- 最终没有被剪枝返回false,则退出循环,返回true
- 定义一个最大值,赋值为当前能走的最大步数,遍历数组,不能剪枝,因为可能中间存在最大的步数
编码
class Solution {
public boolean canJump(int[] nums) {
int max = nums[0];
if (nums.length == 1)return true;
if (max == 0)return false;
for (int i = 1; i < nums.length; i++) {
max = Math.max(--max, nums[i]);
if (nums[i] == 0 && max == 0 && i != nums.length - 1)return false;
}
return true;
}
}