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

一. 简介

前面一篇文章使用贪心算法解决 力扣网55题:跳跃游戏,文章如下:

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

二. 力扣网编程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 , 所以永远不可能到达最后一个下标。

逆向思维分析:

采用逆向思维,从终点倒推判断哪些位置可以到达终点。

从最后一个位置开始往前遍历,维护一个变量 last_pos:表示当前能够跳到到终点的最近位置。

如果 index+ nums[index] >= last_pos,就更新 last_pos为当前位置 index(因为index是新的可到达终点的最小下标)。

遍历完数组,最后判断 last_pos是否为0;

解题思路二:(从后往前逆向思维)

  1. 定义一个变量last_pos:初始化为numsSize-1,表示当前能够跳到终点的最近位置。

  2. 遍历数组,从倒数第二个元素开始,判断当前位置+跳跃的长度(即数组元素值)是否大于等于 last_pos,如果满足,则将last_pos = i(因为 index是新的可到达终点的最小下标);

  3. 数组遍历结束,最后判断last_pos是否为0,如果是则说明数组从首元素可以跳跃到终点,否则不行;

C语言实现如下:

复制代码
//逆向思维
//从数组末尾开始,从后往前遍历
bool canJump(int* nums, int numsSize) {
    //last_pos表示能到达终点位置的最近位置
    //初始时,终点位置是可到达的
    int index;
    int last_pos = numsSize-1;

    for(index = numsSize-1; index >= 0, index--) {
        //关键判断:
        //如果从当前位置index出发,跳跃nums[index]长度的距离能够到达或超过last_pos
        //说明可以从index位置跳跃到last_pos的位置,进而到达终点
        //因为更新last_pos为index,因为现在index成为了新的可到达终点的最前位置
        if((index + nums[index] >= last_pos)) {
            last_pos = index;
        }
    }

    if(!index){
        return true;
    }
    else{
        return false;
    }
}
相关推荐
种自己的花呀13 分钟前
LeetCode 53 最大子数字和(动态规划)
算法·leetcode·动态规划
Craaaayon17 分钟前
【数据结构】二叉树-图解深度优先搜索(递归法、迭代法)
java·数据结构·后端·算法·leetcode·深度优先
高山有多高21 分钟前
C语言实战项目:贪吃蛇(2)
c语言·开发语言·数据结构·c++·算法·游戏·游戏设计
徐归阳1 小时前
第三十七天:2025 图形绘制
算法
weixin_429630261 小时前
机器学习-第三章 线性模型
人工智能·算法·机器学习
补三补四3 小时前
图卷积网络 (GCN)
网络·人工智能·深度学习·神经网络·算法·机器学习
未知陨落3 小时前
LeetCode:82.杨辉三角
算法·leetcode
CoovallyAIHub3 小时前
全球首个精细梯田地块数据集GTPBD发布:为梯田遥感研究填补空白(附数据地址)
深度学习·算法·计算机视觉
CoovallyAIHub3 小时前
【一周AI风暴】周鸿祎放话“不用AI就裁员”,前谷歌CEO鼓吹对华996血拼!
深度学习·算法·计算机视觉
Miraitowa_cheems4 小时前
LeetCode算法日记 - Day 55: 子集、找出所有子集的异或总和再求和
数据结构·算法·leetcode·决策树·深度优先·剪枝