欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > 【贪心算法】(第九篇)

【贪心算法】(第九篇)

2025/2/22 16:55:29 来源:https://blog.csdn.net/weixin_73861555/article/details/143142141  浏览:    关键词:【贪心算法】(第九篇)

目录

跳跃游戏Ⅱ(medium)

题目解析

讲解算法原理

编写代码

跳跃游戏(medium)

题目解析

讲解算法原理

编写代码


跳跃游戏Ⅱ(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给定⼀个⻓度为 n 的0索引整数数组 nums 。初始位置为 nums[0] 。
每个元素 nums[i] 表⽰从索引 i 向前跳转的最⼤⻓度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:
• 0 <= j <= nums[i]
• i + j < n
返回到达 nums[n - 1] 的最⼩跳跃次数。⽣成的测试⽤例可以到达 nums[n - 1] 。
⽰例1:
输⼊:nums=[2,3,1,1,4]
输出:2
解释:跳到最后⼀个位置的最⼩跳跃数是2。
从下标为0跳到下标为1的位置,跳1步,然后跳3步到达数组的最后⼀个位置。⽰例2:
输⼊:nums=[2,3,0,1,4]
输出:2

提⽰:
◦ 1 <= nums.length <= 10(4)
◦ 0 <= nums[i] <= 1000
◦ 题⽬保证可以到达 nums[n-1]

讲解算法原理

解法(动态规划+类似层序遍历):
动态规划:

a. 状态表⽰:
dp[i] 表⽰从 0 位置开始,到达 i 位置时候的最⼩跳跃次数
b. 状态转移⽅程:
对于 dp[i] ,我们遍历 0 ~ i - 1 区间(⽤指针 j 表⽰),只要能够从 j 位置跳到
i 位置( nums[j] + j >= i ),我们就⽤ dp[j] + 1 更新 dp[i] ⾥⾯的值,找到
所有情况下的最⼩值即可。
类似层序遍历的过程:
⽤类似层序遍历的过程,将第 i 次跳跃的「起始位置」和「结束位置」找出来,⽤这次跳跃的情况,更新出下⼀次跳跃的「起始位置」和「终⽌位置」。
这样「循环往复」,就能更新出到达 n - 1 位置的最⼩跳跃步数。

编写代码

c++算法代码:

class Solution
{
public:int jump(vector<int>& nums) {int left = 0, right = 0, maxPos = 0, ret = 0, n = nums.size();while(left <= right) // 保险的写法,以防跳不到 n - 1 的位置{if(maxPos >= n - 1) // 先判断⼀下是否已经能跳到最后⼀个位置 {return ret;}// 遍历当成层,更新下⼀层的最右端点for(int i = left; i <= right; i++){maxPos = max(maxPos, nums[i] + i);}left = right + 1;right = maxPos;ret++;}return -1; // 跳不到的情况}
};

java算法代码:

class Solution
{public int jump(int[] nums) {int left = 0, right = 0, ret = 0, maxPos = 0, n = nums.length;while(left <= right) // 以防跳不到 n - 1 的位置{if(maxPos >= n - 1) // 判断是否已经能跳到最后⼀个位置{return ret;}for(int i = left; i <= right; i++){// 更新下⼀层的最右端点maxPos = Math.max(maxPos, nums[i] + i);}left = right + 1;right = maxPos;ret++;}return -1;}
}

跳跃游戏(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

给你⼀个⾮负整数数组 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,所以永远不可能到达最后⼀个下标。

提⽰:
◦ 1 <= nums.length <= 10(4)
◦ 0 <= nums[i] <= 10(5)

讲解算法原理

解法:
和跳跃游戏II⼀样,仅需修改⼀下返回值即可。

编写代码

c++算法代码:

class Solution
{
public:bool canJump(vector<int>& nums) {int left = 0, right = 0, maxPos = 0, n = nums.size();while(left <= right){if(maxPos >= n - 1){return true;}for(int i = left; i <= right; i++){maxPos = max(maxPos, nums[i] + i);}left = right + 1;right = maxPos;}return false;}
};

java算法代码:

class Solution
{public boolean canJump(int[] nums) {int left = 0, right = 0, maxPos = 0, n = nums.length;while(left <= right){if(maxPos >= n - 1){return true;}for(int i = left; i <= right; i++){maxPos = Math.max(maxPos, nums[i] + i);}left = right + 1;right = maxPos;}return false;}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词