leetcode-55 Jump Game 最远距离问题

本文介绍了一个经典的算法问题——跳跃游戏。通过分析问题背景,给出了一种高效解决方案,并附带详细代码实现。该算法利用一个变量记录可达最远位置,逐步更新最远可达距离,判断是否能到达数组末尾。

问题描述:

Given an array ofnon-negative integers, you are initially positioned at the first index of thearray.

Each element in the arrayrepresents your maximum jump length at that position.

Determine if you are ableto reach the last index.

For example:
A = 
[2,3,1,1,4], return true.

A = [3,2,1,0,4], return false.

 

 

问题分析:

如:[3, 1, 2, 4, 0 ,1]

遍历数组,使用一个变量reach来记录数组所能达到的最远距离位置;

对于每一个位置,其可能达到的最远位置为i+nums[i];

因此,每走一步,只取最终最远的距离,如果前面能走到的距离比当前位置i所能到达的位置更远,则取前面的reach;如果i所能达到的最远距离比reach要远,则取i所能覆盖的距离为最新的reach;

不可达情况,即为走到的i位置,reach范围也就是前面所能达到的最远距离并未覆盖到i点,则表示不可达;这个一般发生在nums[i]=0的情况。

 

代码:

public class Solution {
    public boolean canJump(int[] nums) {
        int i = 0;
        int n = nums.length;
        for (int reach = 0; i < n && i <= reach; ++i)
            reach = Math.max(i + nums[i], reach);
        return i == n;
    }
}

### 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; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值