Leetcode-55-跳跃游戏(贪心、动态规划)

一、题目

给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。

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

https://leetcode-cn.com/problems/jump-game/

二、解题思路

整体思路

1、能否到达最后一个位置
--> 最多能跳多远,如果能跳过最后一个,则为true
2、最值问题
--> 动态规划/贪心

关键问题:最多能跳多远?

贪心
不是顺着值计算去跳跃。
思路1:每一步都计算一下从当前位置最远能够跳到哪里,如果能跳到最后一个位置处就为true。实现见题解1
问题2:会出现badcase1 eg [0,2,3]的情况,即有0处被跳过了,应该为false,最后错误输出了true
思路2: 再加上对0的处理,如果不能往后面跳(max==i),则输出false。实现见题解2
问题2: eg [3,0,8,2,0,0,1] 在0处跳出了,其实可以不走0处,跳到后面然后可以有解,所以应该输出为true,错误输出了true

eg [0]也需要注意

正确思路:
设置一个全局最优的最远位置 farthest 做对比,通过每一步的最优解,更新全局最优解,这就是贪心。
1、如果某一个作为 起跳点 的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以作为 起跳点。
2、可以对每一个能作为 起跳点 的格子都尝试跳一次,把 能跳到最远的距离 不断更新。
3、如果可以一直跳到最后,就成功了。
(很难想到啊emmmmmm)

三、题解

暴力解法

题解1:

Java题解

class Solution {
    public boolean canJump(int[] nums) {
        if (nums.length == 0 || nums.length == 1) {
            return true;
        }
        int max_step = 0, len = nums.length;
        for (int i = 0; i < len - 1; i++) {
            max_step = i + nums[i];
            if (max_step >= (len - 1)) {
                return true;
            }
        }
        return false;
    }
}
badcase1

[0,2,3]

题解2

Java题解

// badcase
// [0]
// [3,0,8,2,0,0,1]
class Solution {
    public boolean canJump(int[] nums) {
        if (nums.length == 0 || nums.length == 1) {
            return true;
        }
        int max_step = 0, len = nums.length;
        for (int i = 0; i < len - 1; i++) {
            max_step = i + nums[i];
            if (max_step >= (len - 1)) {
                return true;
            }
            if (max_step == i) {
                return false;
            }
        }
        return false;
    }
}
badcase2
image.png
题解3

Java题解
错误解答

class Solution {
    public boolean canJump(int[] nums) {
        if (nums.length == 0 || nums.length == 1) {
            return true;
        }
        int max_step = 0, len = nums.length;
        for (int i = 0; i < len; i++) {
            max_step = Math.max(i + nums[i], max_step);         //
            if (max_step >= (len - 1)) {
                return true;
            }
            if (max_step == i) {
                return false;
            }
        }
        return false;
    }
}

错误案例

输入:[2,5,0,0]
输出:false
预期结果:true

正确题解
注意for循环的n-1,遍历的是起跳点

class Solution {
    public boolean canJump(int[] nums) {
        if (nums.length == 0 || nums.length == 1) {
            return true;
        }
        int max_step = 0, len = nums.length;
        for (int i = 0; i < len - 1; i++) {
            max_step = Math.max(i + nums[i], max_step);         //
            if (max_step >= (len - 1)) {
                return true;
            }
            if (max_step == i) {
                return false;
            }
        }
        return false;
    }
}
结果
执行用时:2 ms, 在所有 Java 提交中击败了79.34%的用户
内存消耗:42.1 MB, 在所有 Java 提交中击败了9.80%的用户
复杂度分析

时间复杂度:O(n),遍历一遍数组
空间复杂度:O(1)

四、测试数据

1、[2,5,0,0] true
2、[0] true
n==1
3、[2, 0, 0] true
--> n-1

参考

1、题解参考
2、优秀题解
https://leetcode-cn.com/problems/jump-game/solution/55-by-ikaruga/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343