算法练习12——跳跃游戏

LeetCode 55 跳跃游戏

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

贪心

python 复制代码
class Solution:
    def canJump(self, nums: List[int]) -> bool:
        pos = 0
        for idx, num in enumerate(nums):
            if idx > pos or pos >= len(nums) - 1:
                break
            pos = max(pos, idx + num)
        return pos >= len(nums) - 1

虽然enumerate更加pythonic,但是实际测试enrmerate相比range更加耗时,不过差的很少,大概10ms左右,不影响AC

python 复制代码
class Solution:
    def canJump(self, nums: List[int]) -> bool:
        l = len(nums)
        pos = 0
        for idx in range(l):
            if idx > pos or pos >= l - 1:
                break
            pos = max(pos, idx + nums[idx])
        return pos >= l - 1

动态规划

看了一眼评论区,有人指出贪心实质上是动态规划,动态规划的思路如下,dp[n]为0~n位置能跳到的最远距离,所以状态转移方程为dp[n] = max(dp[n-1], dp[n-1] + nums[n]),初始值可以设置dp[0] = nums[0],一维动态规划,同时根据状态转移方程可知只涉及n和n-1,可以进行滚动优化,使用一个变量即可替代整个dp数组,由此可得解法。实质上滚动优化后动态规划思路的代码和贪心思路的代码是一致的。

果然动态规划最难的是找状态。

相关推荐
Fiona-Dong7 分钟前
Louvain 算法
python·算法
维构lbs智能定位22 分钟前
蓝牙信标、UWB等主流室内定位无线技术的参数对比、核心算法和选型指南详解(二)
算法·蓝牙信标·uwb·主流室内定位无线技术
灰灰勇闯IT1 小时前
【探索实战】Kurator多集群统一应用分发实战:从环境搭建到业务落地全流程
算法
鱼在树上飞1 小时前
乘积最大子数组
算法
Sui_Network1 小时前
备受期待的 POP 射击游戏 XOCIETY 正式在 Epic Games Store 开启体验
人工智能·游戏·rpc·区块链·量子计算·graphql
H_z___1 小时前
Codeforces Round 1070 (Div. 2) A~D F
数据结构·算法
自学小白菜2 小时前
每周刷题 - 第三周 - 双指针专题 - 02
python·算法·leetcode
杜子不疼.2 小时前
【LeetCode76_滑动窗口】最小覆盖子串问题
算法·哈希算法
ComputerInBook2 小时前
代数基本概念理解——特征向量和特征值
人工智能·算法·机器学习·线性变换·特征值·特征向量
不能只会打代码2 小时前
力扣--3433. 统计用户被提及情况
java·算法·leetcode·力扣