LeetCode Hot 100 No.55 跳跃游戏

本文介绍如何使用动态规划算法求解给定数组中,从第一个元素出发,每个位置可以加当前位置数值并前进,目标是找到最大可达最后一个元素的距离。通过示例和步骤详细解析了问题求解过程。

在这里插入图片描述
思路:
设置一个dist变量保存目前能到达的最大距离,从i=0往后遍历到i = nums.length-1(最后一个元素不考虑)。当遍历到的 nums[ i ]下标 i 小于等于dist 时,
计算从该位置能到达的最大距离 d = nums[ i ] + i . 如果d>dist ,就将dist 更新为d。
例:
{ 2,3,1,1,4} dist = 0

i = 0 : i<=dist dist = max( i+nums [ i ], dist) = 2
i = 1 : i<=dist dist = max( i+nums [ i ], dist) = 4
i = 2 : i<=dist dist = max( i+nums [ i ], dist) = 4
i = 3 : i<=dist dist = max( i+nums [ i ], dist) = 4

遍历结束,如果dist>=nums.length-1 说明可以从第一个元素到达最后一个元素,返回true。如果dist<nums.length-1,说明从第一个元素不能到达最后一个元素, 返回false。

### LeetCode - 455 分发饼干 以下是使用 C 语言实现的代码,运用贪心算法,通过对孩子胃口和饼干大小数组排序,然后依次匹配: ```c // qsort()函数的比较函数,升序排列 int cmp(const void* a, const void* b) { return *((int*)a) - *((int*)b); } int findContentChildren(int* g, int gSize, int* s, int sSize) { // 对两个数组排序 qsort(g, gSize, sizeof(int), cmp); qsort(s, sSize, sizeof(int), cmp); int i = 0, j = 0; int count = 0; while (i < gSize && j < sSize) { if (s[j] >= g[i]) { ++count; ++i; ++j; } else { ++j; } } return count; } ``` ### LeetCode - 55 跳跃游戏(1) 该问题判断是否能够到达数组的最后一个位置,使用贪心算法,记录当前能到达的最远位置: ```c #include <stdbool.h> bool canJump(int* nums, int numsSize) { int maxReach = 0; for (int i = 0; i < numsSize; i++) { if (i > maxReach) { return false; } maxReach = (i + nums[i]) > maxReach ? (i + nums[i]) : maxReach; if (maxReach >= numsSize - 1) { return true; } } return false; } ``` ### LeetCode - 45 跳跃游戏(2) 此问题是求到达数组最后一个位置的最少跳跃次数,同样使用贪心算法,记录当前跳跃能到达的边界和下一步能到达的最远位置: ```c int jump(int* nums, int numsSize) { if (numsSize < 2) { return 0; } int jumps = 0; int currentEnd = 0; int farthest = 0; for (int i = 0; i < numsSize - 1; i++) { farthest = (i + nums[i]) > farthest ? (i + nums[i]) : farthest; if (i == currentEnd) { jumps++; currentEnd = farthest; } } return jumps; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值