贪心算法—跳跃游戏

举报
Linux猿 发表于 2022/01/10 00:40:14 2022/01/10
【摘要】 🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!


目录

一、题目描述

二、测试样例

三、算法思路

四、代码实现

五、复杂度分析

5.1 时间复杂度

5.2 空间复杂度

六、题目链接

七、总结


 一、题目描述

给定一个非负整数数组 nums ,你最初位于数组的第一个下标。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。

约束条件:

  • 1 <= nums.length <= 3 * 10^4
  • 0 <= nums[i] <= 10^5

二、测试样例

输入:nums = [2,3,1,1,4]

输出:true

说明:初始时位于下标 2 的位置,可以先跳 1 步,从下标 0 到达下标 1(数组中 3 的位置), 然后再从下标 1 跳 3 步到达最后一个下标(数组中 4 的位置)。

三、算法思路

本题是一道典型的「贪心算法」,依次遍历数组中的每一个元素,每到达一个点,记录能跳跃的最大下标距离 idx,在遍历数组过程中,不断更新这个最大距离 idx,如果遍历到数组中的某一个元素,idx 的距离无法到达当前元素的下标(即:idex < i),表示无法继续往下跳跃,否则直到最大距离 idx 大于等于 n-1 为止(idx >= n - 1 表示可以跳跃到最后的小标 n-1 处)。

四、代码实现

#include <iostream>
#include <vector>
using namespace std;
 
class Solution {
public:
    bool canJump(vector<int>& nums) {
        int idx = 0;
        for(int i = 0; i < nums.size() && idx < nums.size(); ++i) {
            if(idx >= i) {
                idx = max(nums[i] + i, idx);
            } else {
                return false;
            }
        }
        return true;
    }
};
 
int main()
{
    int a[] = {2,3,1,1,4};
    vector<int>nums(a, a+5);
    Solution obj;
    cout<<obj.canJump(nums)<<endl;
    return 0;
}

五、复杂度分析

5.1 时间复杂度

时间复杂度:O(n),在上述算法中,只遍历了一次数组(数组个数为 n),故算法时间复杂度为 O(n)。

5.2 空间复杂度

空间复杂度:O(1),在上述算法中,仅适用到了 idx 一个变量,可以忽略,故空间复杂度为 O(1)。

六、题目链接

跳跃游戏

七、总结

本题考查的是贪心算法的应用,只需要遍历一次即可。


🎈 感觉有帮助记得「一键三连支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞


【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。