LeetCode 45 Hard 跳跃游戏2 Python

[leetcode]45. Jump Game II 跳棋游戏2 C++/PYTHON实现【hard难度】 题目 Given an array of non-negative integers, you are initially positioned at the first index of the array. Each element in the array represents your maximum jump length at that position. Your go 阅读详情

方法一:

    算法:贪心

    思路

        首先要注意到:

            题设是一定可以从头部节点到达尾部节点,和55题类似,如果一个节点可以从i到达j,那么一定可以到达i和j中间

        的任何一个节点i,i+1.i+2,...,j-1,j。同理,这里的题设已经使得数组从0开始一定可以一步一步从0,1,2,3...last

        抵达last节点,也就是从0开始一步一步就遍历数组一定是正确的遍历方式,关键在于何时跳跃,跳跃几次

        何时跳跃?

            在逐个遍历数组的过程中,到达某一位置时,发现从当前位置起跳无法到达更远的位置,由于从0开始一定能到达最

        后一个位置,那么就意味着在当前位置之前,必然有1次跳跃,且跳跃到更远的位置,事实上在该位置之前有多个可以跳

        越到更远位置的地方,那么应该选择跳到哪里?(这时候起跳位置就不重要了,重要的是能跳到哪里去,因为这里要记录的

        是跳跃的次数,并不是跳跃的位置,当然了如果要求跳跃的序列,也可以记录下来,问题不大)。答:应该跳值最远的那个

        地方,贪心的思想

        SO:

            1. 设置jump_before_end 记录最小跳跃次数,注意这里初始值为1,它代表的是到达last前必要的跳跃次数

                经过某个位置后才发现该位置不能跳更远的位置才记录的过去应该有一次跳跃,像一根绳子分3段要切2刀

            2. 设置pre_max_reach记录已遍历位置中最远可达位置

               curr_max_reach 为从头开始遍历的过程中整个过程里最远可达位置的变化情况,i就是和这个比较

            3. i 遍历所有位置,用pre_max_reach更新已经遍历过的这一段中最远可达位置,curr_max_reach跟踪

               整个遍历过程中的最远可达位置,当前位置i>当前整个过程的curr_max_reach时则应该jump+1表明

               在此之前必然有一次跳跃,并且更新curr_max_reach

    复杂度分析

        时间:ON,遍历一次数组

        空间:O1,常数级

def jump_0(self, nums):

    if len(nums) < 2:

        return 0

    jump_befor_end = 1

    pre_max_reach = nums[0]

    curr_max_reach = nums[0]

    for i in range(1, len(nums)):

        if i > curr_max_reach:

            jump_befor_end += 1

            curr_max_reach = pre_max_reach

        pre_max_reach = max(pre_max_reach, i + nums[i])

    return jump_befor_end

 

  方法二:

    算法:与jump_1 思路类似,贪心

    思路

            将遍历过程(跳跃过程,因为0到last可达,故可达0,1,2..last任何一个位置,所以可以遍历)看做是一段一段的

        每一段都跳到最远可达的那个位置

 

            记录当前遍历的情况,记录当前可达最远距离curr_farthest,在遍历数组的过程中更新curr_farthest,

        如果已经抵达当前段的最远位置,再往后走就要跳了,所以counter += 1,更新下一段最远可达位置为之前记录的

        最远可达位置,类似jump_0中的curr_max_reach = pre_max_reach

 

            这里的range只到len(nums)-1是因为,程序只要在到达end时就会+1,由于必然会跳到最后一个节点,那么如果

        条件是 range(len(nums)),则会抵达了最后一个节点,出发i == curr_end 的判断条件,由此一来程序会认为

        最后一个节点处又要开始起跳,counter += 1,会多加一次不必要的跳跃,所以遍历到last-1位置即可

 

    与jump_0对比

            二者其实非常相似,都是记录当前的遍历情况和跳跃情况

            但是jump_0关注的是【超过】跳跃点之后,即继续往下无法到达更远的位置,那么在之前会有一次跳跃,因此counter += 1

            jump_1关注的是当前的遍历和跳跃情况,如果我遍历到了【本段】的最后一个位置,那么就应该跳跃到下一个更远的位置去

 

            所以要注意二者counter += 1 的时刻,条件,背景是与意义是不相同的

 

    复杂度分析

        时间:ON,遍历一次数组

        空间:O1,常数级

def jump_1(self,nums):

    counter = 0

    curr_end = 0

    curr_farthest = 0

    for i in range(len(nums)-1):

        curr_farthest = max(curr_farthest, i + nums[i])

        if i == curr_end:

            counter += 1

            curr_end = curr_farthest

    return counter
"""

从Details中看的一个submit,不是很直观,也没细看

if not nums or len(nums) <= 1:

            return 0

        slow, fast = 0, 0

        step = 0

        last = len(nums) - 1

        while slow <= fast:

            step += 1

            old_fast = fast

            for i in range(slow, fast+1):

                fast = max(fast, i + nums[i])

                if fast >= last:

                    return step

            slow = old_fast + 1

        return 0

"""

 

LeetCode Hard难度题目题解汇总(5/150) 1. Burst Balloons 题目: 有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。 现在要求你戳破所有的气球。每当你戳破一个气球 i 时,你可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。注意当你戳破了气球 i后,气球 left 和... 阅读详情

相关推荐

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 07 堆、栈、表、矩阵、集合、队、数组、字符串、树、图、动态规划、结构体、元组的算法01

当前段必须包含所有字符的最后出现位置。1. 字符串分割成最多片段2. 基因序功能域划分3. 文本段落划分4. 音频声道分离5. 图像色彩分区6. 社交网络社群划分7. 蛋白质结构域8. 音乐乐章分段9. 代码模块划分10. 章节划分特征:一次扫描,贪心确定边界。

weixin_49199313的博客 1131

跳跃游戏python

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例 1:输入:nums = [2,3,1,1,4]输出true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。示例 2:输入:nums = [3,2,1,0,4]输出:false解释:无论怎样,总会到达下标为 3 的位置。

叶柖的博客 1295

带你用Python制作一个经典必收藏的游戏:地铁跑酷(含完整代码)

你一定玩过的游戏:地铁跑酷,图片大家可以自己去找找,或者私信我找我要都OK

阿玥的小博客 9062

LeetCode 45. 跳跃游戏 II

也不同,所以每一个点走一步所能到达最远的点都是不一样的。并且我们保证了走两步点组中的所有点,它们都是最少的步数,它们之中都不存在,明明一步能到的,我们给他更新成了两步(这个之前也分析了),同样也不存在的是,这个走两步点组的右边界的下一个点一定是需要走三步才能到的,也就是说我们把走两步点组的下标范围,也是更新成了最大的范围,不能再大了。这也是贪心的思想,每一个当前最优的状态的,是从上一个最优的状态更新过来的,上一个是最优状态,再走一步到达的这个点,肯定也是最优状态,这也就是这题动态规划+贪心的魅力所在吧。

m0_51691373的博客 763

LeetCode45题解析

给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 示例: 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2。 从下标为 0 跳到下标为 1 的位置,跳1步,然后跳3步到达数组的最后一个位置。 说明: 假设你总是可以到达数组的最后一个位置。 解题思路: 如果我们「贪心」地进行正向查找,每次找到可到达的最远位置,就可以在线性时间内...

blue_coffeei的博客 1488

leetcode精选高频hard题目

leetcode精选高频hard题目 4.寻找两个正序数组的中位数 60.排 37.解数独 51.N皇后 52.N皇后2 149.直线上最多的点数 42.接雨水 135.分发糖果 41.缺失的第一个正数 25.K个一组翻转链表 65.有效数字 28.实现strStr() 132.分割回文串2 44.通配符匹配 10.正则表达式匹配 97.交错字符串 72.编辑距离 32.最长的有效括号 84.柱状图中最大的矩形 85.最大矩阵 239. 滑动窗口最大值 99.恢复二叉搜索树 124.二叉树中的最大.

Worthy_Wang的博客 5837

leetcode45. 跳跃游戏 II

题目来源 leetcode:jump-game-ii 题目描述 class Solution { public: int jump(vector<int>& nums) { } }; 题目解析 从数组的第 0 个位置开始跳,跳的距离小于等于数组上对应的数。求出跳到最后个位置需要的最短步数。 贪心 思路:别想那么多,就挨着跳吧 如果某一个起跳点的格式可以跳跃的距离是3,那么表示后面3个格子都可以作为起跳点 如果从这个起跳点叫做第1次跳跃,那么从后面3个格子起

OceanStar的博客 1906

[Leetcode 45, Hard] Jump Game II

[Leetcode 45, Hard] Jump Game

算法的实践 488

[LeetCode] 45. Jump Game II_ Hard tag: Dynamic Programming

Given an array of non-negative integers, you are initially positioned at the first index of the array. Each element in the array represents your maximum jump length at that position. Your goal is to...

weixin_30763455的博客 81

每周技术面试高频题汇总:大厂面试官到底在考什么?完整实战指南

大家好,又到了每周的面试复盘时间。。现在的面试官更喜欢把你扔进一个具体的“场景”里,看你怎么思考、怎么权衡(Trade-off)。基于过去一周 CSDN、掘金、LeetCode 等社区的热议内容,我为大家精选了,涵盖算法、系统设计、数据库和网络四大领域。咱们不整那些虚的,直接上干货,看看这些题目背后的考察点和解题思路。

热爱技术与前沿创新,深耕科技领域,在科创中精进自我;探索技术乐趣,分享技术干货与成长心得,以技术为伴,热爱生活,在科创与生活中双向成长。 432

LeetCode45 题:跳跃游戏 (C++)

45. 跳跃游戏 II - 力扣(LeetCode) 贪心算法的思路:注意数值代表的是可以跳跃的最大长度,也就是说是最多可以跳这么远,但是不跳这么远也行。看示例: [2,3,1,1,4] i= 0,第一次站在数字2的位置,最多可以跳两个,也就是活可以跳到3(下标1)的位置,也可以跳到1(下标2)的位置。那跳到哪个位置好呢?首先肯定会向哪儿的数值越大就跳到哪儿,但是这样不是很对,虽然这儿确实是跳到3的地方好。 因为,3的位置相对与1的位置来说,3靠前一个身位,假设我跳到3,后续从3往后跳的时候,还是会经过

zj 1053

一招解决4道leetcode hard题,动态规划在字符串匹配问题中的应用

全文共2869个字,6张图,预计阅读时间15分钟。在做leetcode的时候,遇到hard题大家往往都觉得头疼,但其实,掌握方法,举一反三,hard题有时候我们也能想到好...

leadai的博客 948

leetcode45

给你一个非负整数数组nums ,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 假设你总是可以到达数组的最后一个位置。

weixin_47147899的博客 319

LeetCode 每日一题 Day 13(Hard)|| 二维前缀和&二维差分

遍历 cnt,如果存在一个空格子的计数值为 0,就表明该空格子没有被邮票覆盖,返回 false,否则返回 true。输入:grid = [[1,0,0,0],[1,0,0,0],[1,0,0,0],[1,0,0,0],[1,0,0,0]], stampHeight = 4, stampWidth = 3。输入:grid = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]], stampHeight = 2, stampWidth = 2。遍历所有能放邮票的位置去放邮票。

m0_73814009的博客 1351

Python代码实现天天酷跑小游戏

python代码实现天天酷跑

kakA的博客 975

leecode#63 Unique Path Ⅱ

一个机器人位于一个m x n网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径? 网格中的障碍物和空位置分别用1和0来表示。 说明:m和n的值均不超过 100。 示例1: 输入: ...

dengshengza7587的博客 287

LeetCode45题-跳跃游戏||-java实现-图解思路与手撕代码

LeetCode45题-跳跃游戏||-java实现-图解思路与手撕代码

weixin_45271005的博客 1114

字节3面真题,LeetCodehard难度,极具启发性题解

铁子们好啊!阿辉来讲道题,这道题据说是23年字节3面真题,LeetCode上面hard难度,而且是很多难题的基础模板,今天阿辉就带你拿下它!!!

m0_75108739的博客 2621
上一篇: Python中可变对象与不可变对象
下一篇: LeetCode Medium 55 跳跃游戏 Python
咚咚咚Boom
博客等级 码龄11年 22粉丝 95原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值