力扣网编程55题:跳跃游戏之贪心算法

一. 简介

本文记录力扣网上涉及数组方面的编程题:跳跃游戏。

二. 力扣网编程55题:跳跃游戏

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

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

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

力扣网编程55题:跳跃游戏之贪心算法_第1张图片

题目分析:

什么是贪心算法?

贪心算法(Gre心 Algorithm)是一种在每个步骤中做出局部最优选择的算法,目的是希望这些局部最优解能够导致全局最优解。

首先,数组中元素都大于等于0;

数组中每个元素的大小代表在该位置上能跳跃的最长长度;

解题的关键是追踪当前能够到达的最远位置。

解题思路一:(贪心解法:遍历数组,更新当前能到达的最远位置)

1.  定义一个变量 max_reach ,记录当前能到达的最远位置;

2. 遍历数组,判断 当前元素的索引值Index 是否 > 当前能到达的最远位置 max_reach,是则直接返回 false(说明已经不能跳跃到达最后一个元素了);

遍历数组过程中,不断更新 max_reach;

3. 如果能运行到循环结束,则说明可以跳跃到最后一个元素,返回true;

C语言实现:


//普通解法:遍历数组,不断更新当前可达到的最远距离
bool canJump(int* nums, int numsSize) {
    int i;
    //可以跳跃到的最远位置
    int max_reach = 0;

    for(i = 0; i < numsSize; i++) {
         如果当前位置超过了当前能到达的最远位置
        //说明已经不能到达最后一个元素了
        if(i > max_reach) {
            return false;
        }
        //更新当前能到达的最远距离
        int current_reach = i+nums[i];
        if(current_reach > max_reach) {
            max_reach = current_reach;
        }
    }

    //否则,则说明可以跳跃到最后一个位置
    return true;
}

上面的实现其实可以再优化。

优化点:在遍历数组过程中,如果 max_reach >= numsSize-1时,说明已经提前到达最后一个元素。实现如下:


//贪心解法:遍历数组,不断更新当前可达到的最远距离
bool canJump(int* nums, int numsSize) {
    int i;
    //可以跳跃到的最远位置
    int max_reach = 0;

    for(i = 0; i < numsSize; i++) {
        //当前元素的index > 当前能到达的最远距离
        //说明已经不能到达最后一个元素了
        if(i > max_reach) {
            return false;
        }
        //更新当前能到达的最远距离
        int current_reach = i+nums[i];
        if(current_reach > max_reach) {
            max_reach = current_reach;
        }
        //max_reach >= numsSize-1,说明已经到达或超过最后一个位置
        //提前结束(优化点)
        if(max_reach >= numsSize-1) {
            return true;
        }
    }

    //否则,则说明可以跳跃到最后一个位置
    return true;
}

下一篇文章通过逆向思维来解决这个题目,文章如下:

力扣网编程55题:跳跃游戏之逆向思维-CSDN博客

你可能感兴趣的:(逻辑编程题,算法,leetcode)