【右界覆盖】55. 跳跃游戏

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

解题思路:贪心

方式1. 状态转换

第一个下标是否能够跳到最后一个下标 等价于 最后一个下标是否能到达第一个下标。

我们将数组反向遍历,初始化时指针停留在倒数第二个下标,此时目标索引为最后一个下标。
如果倒数第二个下标能够跳到最后一个下标,那么也就意味着:如果到达第二个下标,就一定能够到达最后一个下标,因此可以将目标索引转换为倒数第二个下标。【状态转换】
● 那么如何判断某一索引能够跳到目标索引呢?→ nums[i] ≥ target_index - i
当我们遍历完数组,我们只需要判断第一个下标是否能够到达target_index(或者说第一个下标能否变成target_index)即可。

把目标索引变得尽可能小,这就是贪心贪的地方!
因为如果某一个位置能够跳到最后一个下标位置,那么一定能够跳到比它跳数更小的位置(题目限定了最大跳数)!

class Solution {
    public boolean canJump(int[] nums) {
        int target_index = nums.length - 1;
        for(int i=target_index-1; i >= 0; i--){
            if(nums[i] >= target_index - i){
                target_index = i;
            }
        }
        return target_index == 0;
    }
}
方式2. 最大覆盖右界 ⭐

只关注当前可以被覆盖的区间。
我们设立一个覆盖区间的右界指针,右界往左(包括右界)的位置均可以到达! \color{blue}{注意}

我们顺序遍历这个区间的过程中,每遍历一个元素,都更新最大右界【贪心所贪,尽量覆盖更大的右界】,并判断它是否覆盖了最后一个位置。遍历指针i会一直往前移动,不会回头。(因为已经遍历过的位置,已经找过了最大右界)

● 成功条件:覆盖到了最后一个位置;
● 失败条件:已经到达最大右界,仍然没有覆盖到最后一个位置。

class Solution {
    public boolean canJump(int[] nums) {
        int max_index = 0;
        int i = 0;
        while(i < nums.length && i <= max_index){ // 只在覆盖范围内走
            int tmp = nums[i] + i; // 当前元素覆盖的范围
            if(tmp >= nums.length-1) return true; // 覆盖到最后一个元素
            if(tmp > max_index) max_index = tmp; // 每走一步都更新最大覆盖范围
            i++;
        }
        return false;
    }
}
方式3. 模拟(效率比较低)—— 倒过来思考,会有效率的提升,可参考方式1
class Solution {
    public boolean canJump(int[] nums) {
        boolean dp[] = new boolean[nums.length];
        dp[0] = true;
        for(int i=0; i<nums.length; i++){
            if(dp[i]){
                int tmp = i+nums[i];
                for(int j=i+1; j<nums.length&&j<=tmp; j++){
                    dp[j] = true;
                }
            }
        }
        return dp[nums.length-1];
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容

  • 题目 给定一个非负整数数组 nums。一开始位于数组的第一个位置,数组中的数字代表该位置能跳到的最大距离。如果能到...
    sarto阅读 536评论 0 0
  • 1.跳跃游戏(55-中) 题目描述:给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个...
    _code_x阅读 194评论 0 1
  • 跳跃游戏[https://leetcode-cn.com/problems/jump-game/] 给定一个非负整...
    wyof阅读 493评论 0 0
  • 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度...
    牛肋排阅读 353评论 0 0
  • 题目给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否...
    HITZGD阅读 244评论 0 0