算法小知识-----10.26----- 跳跃游戏

46 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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;
    }
}

image.png