leetcode每日一题——55.跳跃游戏(面试经典150题)

一、题目描述与要求

55. 跳跃游戏 - 力扣(LeetCode)

题目描述

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

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

判断你是否能够到达最后一个下标

示例

示例1:

输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。

示例2:

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

提示

  • 1 <= nums.length <= 3 * 104
  • 0 <= nums[i] <= 105

二、解题思路

总的思路:

       先分析题目,这一问题是需要我们根据数组里面存储的数据来判断能否到达最后一个下标。而数组中的每个元素代表我们在当前位置可以跳跃的最大长度,也就是跳跃的长度可以小于它。但这其实不管也可以,我们不需要去输出我们到达最后一个下标的过程,而是只需要对我们能否到达最后一个下标进行判断。因而问题就变得简单了。

       现在我们来思考,怎样才能够知道我能否到达最后一个下标呢?我们知道我们所在每一个位置都有对应我们能够跳跃的最大长度,那么通过这些最大长度我们是不是就可以知道当我们在每一个位置时能够到达的最远位置。也就是当前位置i+nums[i]。因此我们可以定义一个变量site存储这个最远位置。而我们需要判断的是我们能否到达最后一个下标。这就可以利用贪心算法的思想,我们依次找出每一个位置对应能到达的最远位置,然后取其中最大的,不就是总体能到达的最远位置。

       找到这个最远位置后,我们就要判断我们能否跳到这一步,因而我们需要对数组进行遍历,然后将当下的下标与最远位置进行比较,只要当当前位置i≤site(最远位置),那就说明我们最后一定能够达到这一步。而一旦出现i>site的情况,则说明目前所取到的最远距离并不是最后一个下标,因而我们无法到达最后一个下标,则返回false。

具体步骤:

①定义存储最远位置的变量site

②遍历数组,判断当前坐标是否大于最远位置,是的话返回false;不是的话更新当前最远位置,直至遍历完整个数组。

③定义max函数,用于更新最远位置。


三、具体代码【C语言】

【时间复杂度:O(n) 空间复杂度:O(1)】

int max(int a,int b)
{
    return a>b?a:b;
}

bool canJump(int* nums, int numsSize){
    //贪心算法
    int site = 0;//用来记录最远的位置
    //遍历数组,找到整个数组中能够达到的最远位置并记录下来
    //然后将其与当前位置进行比较,只有当当前位置小于等于最远位置才有可能到达最后一个下标
    //一旦出现当前下标大于最远位置的情况,则代表无法到达最后一个下标。
    for (int i = 0; i < numsSize; i++) 
    {
        if (i > site) 
        {
            return false;
        }
        site = max(site, i + nums[i]);//不断更新所能到的最远位置
    }
    return true;
}

猜你喜欢

转载自blog.csdn.net/m0_59800431/article/details/131592518
今日推荐