算法——Week16

本文深入解析了Jump Game算法问题,探讨了如何判断能否从数组起始位置跳跃至末尾。通过两种不同思路,一是检查0元素前的位置是否能跳过0,二是记录可达最远距离直至遍历结束,提供了详细的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

55. Jump Game
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.

Determine if you are able to reach the last index.

Example 1:

Input: [2,3,1,1,4]
Output: true
Explanation: Jump 1 step from index 0 to 1, then 3 steps to the last index.

Example 2:

Input: [3,2,1,0,4]
Output: false
Explanation: You will always arrive at index 3 no matter what. Its maximum
jump length is 0, which makes it impossible to reach the last index.


解题思路
这道题目其实关键在于0 。没有出现0,则一定返回true。出现了0,如ex1,之前所有位置都不能跳过0,那一定返回flase。题目就化简为,判断0之前的所有数,到0的距离和数值比大小。


代码如下:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        if(nums.size() <= 1) {
            return true;
        }
        if(nums[0] == 0) {
            return false;
        }
        vector<int> zerostep;
        for(int i = 0; i < nums.size() - 1; i++) {
            if(nums[i] == 0) {
                zerostep.push_back(i);
            }
        }
        if(zerostep.size() == 0) {
            return true;
        }
        vector<int> tag(zerostep.size(), 0);
        for(int k = 0; k < zerostep.size(); k++) {
            for(int i = 0; i < zerostep[k]; i++) {
                if(nums[i] > zerostep[k] - i) {
                    tag[k] = 1;
                    break;
                }
            }
            if(tag[k] == 0){
                return false;
            }
        }
        return true;
    }
};

基于另一种思路,从第一个位置开始遍历,并记录可以到达的最远的距离(可以大于数组长度),直到当前位置不可达或者到达最后一个位置。判断当前位置是否为最后一个位置,是则返回真,否则返回假。
代码如下:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int len = nums.size();
        if(len == 1) {
            return true;
        }
        int i = 0;
        for(int reach = 0; i < len && i <= reach; i++) {
            reach = max(i + nums[i], reach);
        }
        return i == len;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值