leetcode - 55. 跳跃游戏

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

示例 1:

输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。

示例 2:

输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/jump-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
————————
解题思路:使用贪心算法,设定一个标记值 i n d e x index index,标记值 i n d e x index index初始值为数组 n u m s nums nums的终点位置,从倒数第二个数 n u m s [ i ] nums[i] nums[i]往前 ( i ⇒ 0 ) (i\Rightarrow 0) (i0)遍历,查看是否存在满足条件的情况: n u m s [ i ] + i > = i n d e x nums[i]+i>=index nums[i]+i>=index如果满足条件,则把 i n d e x index index的值改为: i n d e x = i index=i index=i然后继续遍历,最后对 i n d e x index index进行判断。如果 i n d e x index index的值为0,表示能到达数组终点。

因为从 i n d e x index index所在的位置是一定能到达终点的,所以如果存在 n u m s [ i ] + i > = i n d e x nums[i]+i>=index nums[i]+i>=index那么意思就是存在 i i i能到达 i n d e x index index所在的位置,所以从 i i i能到达终点。

具体的c++代码如下:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int index = nums.size()-1;  # 初始化index为数组终点
        for(int i=nums.size()-1;i>=0;--i)
        {
            if(nums[i]+i>=index)  # 如果符合判断条件
                index = i;  # 更新index的值
        }
        return index==0;  # 判断index是否为0,为0则返回true
    } 
};

个人解法:因为只要数组中不存在0,则数组是一定可以从起点到达终点的。因为数组是非负数组,所以一定存在元素0。设0元素所在的索引为 i n d e x index index,这时候就要判断从起始点到0这段距离内,是否存在元素 n u m s [ i ] nums[i] nums[i]使得 n u m s [ i ] + i > i n d e x nums[i]+i>index nums[i]+i>index如果该条件成立,则数组可以跳过零元素继续向前移动;但是注意当0元素位于数组终点时,判断条件为 n u m s [ i ] + i > = i n d e x nums[i]+i>=index nums[i]+i>=index其C++代码为

class Solution {
public:
    int dfs(vector<int>& nums,int n)  # 递归函数,n是数组nums中零元素所在的位置
    {
        for(int i=0;i<n;i++)  # 遍历从起始点到零元素
        {
            if(nums[i]+i>n && n!=nums.size()-1)  # 如果零元素所在的位置不是数组终点
                return 1;
            else if(nums[i]+i>=n && n==nums.size()-1)  # 如果零元素所在的位置是数组的终点
                return 1;
        }
        return 0;  # 不能跳过零元素,则直接返回0
    }
    bool canJump(vector<int>& nums) {
        int flag = 1;  # 标记flag,当为1时表示能从起点到终点,当为0时表示不能
        if(nums.size()==1)  # 当数组长度为1时,一定可以到达终点,所以返回1
            return 1;
        for(int i=0;i<nums.size();i++)  # 遍历数组,寻找零元素的位置
        {
            if(nums[i]!=0)  # 如果当前元素不为零,直接跳过
                continue;
            if(nums[i]==0)  # 如果当前元素为零,进入判断函数
                flag = dfs(nums,i);
            if(flag==0) # 当flag为0时,表示存在元素0不能跳过,直接跳出循环,返回flag
                break;
        }
        return flag;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值